cannam@86: cannam@86:
cannam@86:00001 /* libFLAC - Free Lossless Audio Codec library cannam@86: 00002 * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson cannam@86: 00003 * cannam@86: 00004 * Redistribution and use in source and binary forms, with or without cannam@86: 00005 * modification, are permitted provided that the following conditions cannam@86: 00006 * are met: cannam@86: 00007 * cannam@86: 00008 * - Redistributions of source code must retain the above copyright cannam@86: 00009 * notice, this list of conditions and the following disclaimer. cannam@86: 00010 * cannam@86: 00011 * - Redistributions in binary form must reproduce the above copyright cannam@86: 00012 * notice, this list of conditions and the following disclaimer in the cannam@86: 00013 * documentation and/or other materials provided with the distribution. cannam@86: 00014 * cannam@86: 00015 * - Neither the name of the Xiph.org Foundation nor the names of its cannam@86: 00016 * contributors may be used to endorse or promote products derived from cannam@86: 00017 * this software without specific prior written permission. cannam@86: 00018 * cannam@86: 00019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS cannam@86: 00020 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT cannam@86: 00021 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR cannam@86: 00022 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR cannam@86: 00023 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, cannam@86: 00024 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, cannam@86: 00025 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR cannam@86: 00026 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF cannam@86: 00027 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING cannam@86: 00028 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS cannam@86: 00029 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. cannam@86: 00030 */ cannam@86: 00031 cannam@86: 00032 #ifndef FLAC__STREAM_ENCODER_H cannam@86: 00033 #define FLAC__STREAM_ENCODER_H cannam@86: 00034 cannam@86: 00035 #include <stdio.h> /* for FILE */ cannam@86: 00036 #include "export.h" cannam@86: 00037 #include "format.h" cannam@86: 00038 #include "stream_decoder.h" cannam@86: 00039 cannam@86: 00040 #ifdef __cplusplus cannam@86: 00041 extern "C" { cannam@86: 00042 #endif cannam@86: 00043 cannam@86: 00044 cannam@86: 00240 typedef enum { cannam@86: 00241 cannam@86: 00242 FLAC__STREAM_ENCODER_OK = 0, cannam@86: 00245 FLAC__STREAM_ENCODER_UNINITIALIZED, cannam@86: 00251 FLAC__STREAM_ENCODER_OGG_ERROR, cannam@86: 00254 FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR, cannam@86: 00259 FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA, cannam@86: 00264 FLAC__STREAM_ENCODER_CLIENT_ERROR, cannam@86: 00267 FLAC__STREAM_ENCODER_IO_ERROR, cannam@86: 00272 FLAC__STREAM_ENCODER_FRAMING_ERROR, cannam@86: 00277 FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR cannam@86: 00280 } FLAC__StreamEncoderState; cannam@86: 00281 cannam@86: 00287 extern FLAC_API const char * const FLAC__StreamEncoderStateString[]; cannam@86: 00288 cannam@86: 00289 cannam@86: 00292 typedef enum { cannam@86: 00293 cannam@86: 00294 FLAC__STREAM_ENCODER_INIT_STATUS_OK = 0, cannam@86: 00297 FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR, cannam@86: 00300 FLAC__STREAM_ENCODER_INIT_STATUS_UNSUPPORTED_CONTAINER, cannam@86: 00305 FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_CALLBACKS, cannam@86: 00308 FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_NUMBER_OF_CHANNELS, cannam@86: 00311 FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BITS_PER_SAMPLE, cannam@86: 00317 FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_SAMPLE_RATE, cannam@86: 00320 FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BLOCK_SIZE, cannam@86: 00323 FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_MAX_LPC_ORDER, cannam@86: 00326 FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_QLP_COEFF_PRECISION, cannam@86: 00329 FLAC__STREAM_ENCODER_INIT_STATUS_BLOCK_SIZE_TOO_SMALL_FOR_LPC_ORDER, cannam@86: 00332 FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE, cannam@86: 00335 FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA, cannam@86: 00344 FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED cannam@86: 00350 } FLAC__StreamEncoderInitStatus; cannam@86: 00351 cannam@86: 00357 extern FLAC_API const char * const FLAC__StreamEncoderInitStatusString[]; cannam@86: 00358 cannam@86: 00359 cannam@86: 00362 typedef enum { cannam@86: 00363 cannam@86: 00364 FLAC__STREAM_ENCODER_READ_STATUS_CONTINUE, cannam@86: 00367 FLAC__STREAM_ENCODER_READ_STATUS_END_OF_STREAM, cannam@86: 00370 FLAC__STREAM_ENCODER_READ_STATUS_ABORT, cannam@86: 00373 FLAC__STREAM_ENCODER_READ_STATUS_UNSUPPORTED cannam@86: 00376 } FLAC__StreamEncoderReadStatus; cannam@86: 00377 cannam@86: 00383 extern FLAC_API const char * const FLAC__StreamEncoderReadStatusString[]; cannam@86: 00384 cannam@86: 00385 cannam@86: 00388 typedef enum { cannam@86: 00389 cannam@86: 00390 FLAC__STREAM_ENCODER_WRITE_STATUS_OK = 0, cannam@86: 00393 FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR cannam@86: 00396 } FLAC__StreamEncoderWriteStatus; cannam@86: 00397 cannam@86: 00403 extern FLAC_API const char * const FLAC__StreamEncoderWriteStatusString[]; cannam@86: 00404 cannam@86: 00405 cannam@86: 00408 typedef enum { cannam@86: 00409 cannam@86: 00410 FLAC__STREAM_ENCODER_SEEK_STATUS_OK, cannam@86: 00413 FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR, cannam@86: 00416 FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED cannam@86: 00419 } FLAC__StreamEncoderSeekStatus; cannam@86: 00420 cannam@86: 00426 extern FLAC_API const char * const FLAC__StreamEncoderSeekStatusString[]; cannam@86: 00427 cannam@86: 00428 cannam@86: 00431 typedef enum { cannam@86: 00432 cannam@86: 00433 FLAC__STREAM_ENCODER_TELL_STATUS_OK, cannam@86: 00436 FLAC__STREAM_ENCODER_TELL_STATUS_ERROR, cannam@86: 00439 FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED cannam@86: 00442 } FLAC__StreamEncoderTellStatus; cannam@86: 00443 cannam@86: 00449 extern FLAC_API const char * const FLAC__StreamEncoderTellStatusString[]; cannam@86: 00450 cannam@86: 00451 cannam@86: 00452 /*********************************************************************** cannam@86: 00453 * cannam@86: 00454 * class FLAC__StreamEncoder cannam@86: 00455 * cannam@86: 00456 ***********************************************************************/ cannam@86: 00457 cannam@86: 00458 struct FLAC__StreamEncoderProtected; cannam@86: 00459 struct FLAC__StreamEncoderPrivate; cannam@86: 00464 typedef struct { cannam@86: 00465 struct FLAC__StreamEncoderProtected *protected_; /* avoid the C++ keyword 'protected' */ cannam@86: 00466 struct FLAC__StreamEncoderPrivate *private_; /* avoid the C++ keyword 'private' */ cannam@86: 00467 } FLAC__StreamEncoder; cannam@86: 00468 cannam@86: 00518 typedef FLAC__StreamEncoderReadStatus (*FLAC__StreamEncoderReadCallback)(const FLAC__StreamEncoder *encoder, FLAC__byte buffer[], size_t *bytes, void *client_data); cannam@86: 00519 cannam@86: 00556 typedef FLAC__StreamEncoderWriteStatus (*FLAC__StreamEncoderWriteCallback)(const FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data); cannam@86: 00557 cannam@86: 00590 typedef FLAC__StreamEncoderSeekStatus (*FLAC__StreamEncoderSeekCallback)(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data); cannam@86: 00591 cannam@86: 00635 typedef FLAC__StreamEncoderTellStatus (*FLAC__StreamEncoderTellCallback)(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data); cannam@86: 00636 cannam@86: 00654 typedef void (*FLAC__StreamEncoderMetadataCallback)(const FLAC__StreamEncoder *encoder, const FLAC__StreamMetadata *metadata, void *client_data); cannam@86: 00655 cannam@86: 00677 typedef void (*FLAC__StreamEncoderProgressCallback)(const FLAC__StreamEncoder *encoder, FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate, void *client_data); cannam@86: 00678 cannam@86: 00679 cannam@86: 00680 /*********************************************************************** cannam@86: 00681 * cannam@86: 00682 * Class constructor/destructor cannam@86: 00683 * cannam@86: 00684 ***********************************************************************/ cannam@86: 00685 cannam@86: 00693 FLAC_API FLAC__StreamEncoder *FLAC__stream_encoder_new(void); cannam@86: 00694 cannam@86: 00701 FLAC_API void FLAC__stream_encoder_delete(FLAC__StreamEncoder *encoder); cannam@86: 00702 cannam@86: 00703 cannam@86: 00704 /*********************************************************************** cannam@86: 00705 * cannam@86: 00706 * Public class method prototypes cannam@86: 00707 * cannam@86: 00708 ***********************************************************************/ cannam@86: 00709 cannam@86: 00727 FLAC_API FLAC__bool FLAC__stream_encoder_set_ogg_serial_number(FLAC__StreamEncoder *encoder, long serial_number); cannam@86: 00728 cannam@86: 00743 FLAC_API FLAC__bool FLAC__stream_encoder_set_verify(FLAC__StreamEncoder *encoder, FLAC__bool value); cannam@86: 00744 cannam@86: 00761 FLAC_API FLAC__bool FLAC__stream_encoder_set_streamable_subset(FLAC__StreamEncoder *encoder, FLAC__bool value); cannam@86: 00762 cannam@86: 00773 FLAC_API FLAC__bool FLAC__stream_encoder_set_channels(FLAC__StreamEncoder *encoder, unsigned value); cannam@86: 00774 cannam@86: 00789 FLAC_API FLAC__bool FLAC__stream_encoder_set_bits_per_sample(FLAC__StreamEncoder *encoder, unsigned value); cannam@86: 00790 cannam@86: 00801 FLAC_API FLAC__bool FLAC__stream_encoder_set_sample_rate(FLAC__StreamEncoder *encoder, unsigned value); cannam@86: 00802 cannam@86: 00864 FLAC_API FLAC__bool FLAC__stream_encoder_set_compression_level(FLAC__StreamEncoder *encoder, unsigned value); cannam@86: 00865 cannam@86: 00879 FLAC_API FLAC__bool FLAC__stream_encoder_set_blocksize(FLAC__StreamEncoder *encoder, unsigned value); cannam@86: 00880 cannam@86: 00893 FLAC_API FLAC__bool FLAC__stream_encoder_set_do_mid_side_stereo(FLAC__StreamEncoder *encoder, FLAC__bool value); cannam@86: 00894 cannam@86: 00909 FLAC_API FLAC__bool FLAC__stream_encoder_set_loose_mid_side_stereo(FLAC__StreamEncoder *encoder, FLAC__bool value); cannam@86: 00910 cannam@86: 00954 FLAC_API FLAC__bool FLAC__stream_encoder_set_apodization(FLAC__StreamEncoder *encoder, const char *specification); cannam@86: 00955 cannam@86: 00966 FLAC_API FLAC__bool FLAC__stream_encoder_set_max_lpc_order(FLAC__StreamEncoder *encoder, unsigned value); cannam@86: 00967 cannam@86: 00984 FLAC_API FLAC__bool FLAC__stream_encoder_set_qlp_coeff_precision(FLAC__StreamEncoder *encoder, unsigned value); cannam@86: 00985 cannam@86: 00998 FLAC_API FLAC__bool FLAC__stream_encoder_set_do_qlp_coeff_prec_search(FLAC__StreamEncoder *encoder, FLAC__bool value); cannam@86: 00999 cannam@86: 01010 FLAC_API FLAC__bool FLAC__stream_encoder_set_do_escape_coding(FLAC__StreamEncoder *encoder, FLAC__bool value); cannam@86: 01011 cannam@86: 01024 FLAC_API FLAC__bool FLAC__stream_encoder_set_do_exhaustive_model_search(FLAC__StreamEncoder *encoder, FLAC__bool value); cannam@86: 01025 cannam@86: 01047 FLAC_API FLAC__bool FLAC__stream_encoder_set_min_residual_partition_order(FLAC__StreamEncoder *encoder, unsigned value); cannam@86: 01048 cannam@86: 01070 FLAC_API FLAC__bool FLAC__stream_encoder_set_max_residual_partition_order(FLAC__StreamEncoder *encoder, unsigned value); cannam@86: 01071 cannam@86: 01082 FLAC_API FLAC__bool FLAC__stream_encoder_set_rice_parameter_search_dist(FLAC__StreamEncoder *encoder, unsigned value); cannam@86: 01083 cannam@86: 01098 FLAC_API FLAC__bool FLAC__stream_encoder_set_total_samples_estimate(FLAC__StreamEncoder *encoder, FLAC__uint64 value); cannam@86: 01099 cannam@86: 01181 FLAC_API FLAC__bool FLAC__stream_encoder_set_metadata(FLAC__StreamEncoder *encoder, FLAC__StreamMetadata **metadata, unsigned num_blocks); cannam@86: 01182 cannam@86: 01191 FLAC_API FLAC__StreamEncoderState FLAC__stream_encoder_get_state(const FLAC__StreamEncoder *encoder); cannam@86: 01192 cannam@86: 01203 FLAC_API FLAC__StreamDecoderState FLAC__stream_encoder_get_verify_decoder_state(const FLAC__StreamEncoder *encoder); cannam@86: 01204 cannam@86: 01216 FLAC_API const char *FLAC__stream_encoder_get_resolved_state_string(const FLAC__StreamEncoder *encoder); cannam@86: 01217 cannam@86: 01235 FLAC_API void FLAC__stream_encoder_get_verify_decoder_error_stats(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_sample, unsigned *frame_number, unsigned *channel, unsigned *sample, FLAC__int32 *expected, FLAC__int32 *got); cannam@86: 01236 cannam@86: 01245 FLAC_API FLAC__bool FLAC__stream_encoder_get_verify(const FLAC__StreamEncoder *encoder); cannam@86: 01246 cannam@86: 01255 FLAC_API FLAC__bool FLAC__stream_encoder_get_streamable_subset(const FLAC__StreamEncoder *encoder); cannam@86: 01256 cannam@86: 01265 FLAC_API unsigned FLAC__stream_encoder_get_channels(const FLAC__StreamEncoder *encoder); cannam@86: 01266 cannam@86: 01275 FLAC_API unsigned FLAC__stream_encoder_get_bits_per_sample(const FLAC__StreamEncoder *encoder); cannam@86: 01276 cannam@86: 01285 FLAC_API unsigned FLAC__stream_encoder_get_sample_rate(const FLAC__StreamEncoder *encoder); cannam@86: 01286 cannam@86: 01295 FLAC_API unsigned FLAC__stream_encoder_get_blocksize(const FLAC__StreamEncoder *encoder); cannam@86: 01296 cannam@86: 01305 FLAC_API FLAC__bool FLAC__stream_encoder_get_do_mid_side_stereo(const FLAC__StreamEncoder *encoder); cannam@86: 01306 cannam@86: 01315 FLAC_API FLAC__bool FLAC__stream_encoder_get_loose_mid_side_stereo(const FLAC__StreamEncoder *encoder); cannam@86: 01316 cannam@86: 01325 FLAC_API unsigned FLAC__stream_encoder_get_max_lpc_order(const FLAC__StreamEncoder *encoder); cannam@86: 01326 cannam@86: 01335 FLAC_API unsigned FLAC__stream_encoder_get_qlp_coeff_precision(const FLAC__StreamEncoder *encoder); cannam@86: 01336 cannam@86: 01345 FLAC_API FLAC__bool FLAC__stream_encoder_get_do_qlp_coeff_prec_search(const FLAC__StreamEncoder *encoder); cannam@86: 01346 cannam@86: 01355 FLAC_API FLAC__bool FLAC__stream_encoder_get_do_escape_coding(const FLAC__StreamEncoder *encoder); cannam@86: 01356 cannam@86: 01365 FLAC_API FLAC__bool FLAC__stream_encoder_get_do_exhaustive_model_search(const FLAC__StreamEncoder *encoder); cannam@86: 01366 cannam@86: 01375 FLAC_API unsigned FLAC__stream_encoder_get_min_residual_partition_order(const FLAC__StreamEncoder *encoder); cannam@86: 01376 cannam@86: 01385 FLAC_API unsigned FLAC__stream_encoder_get_max_residual_partition_order(const FLAC__StreamEncoder *encoder); cannam@86: 01386 cannam@86: 01395 FLAC_API unsigned FLAC__stream_encoder_get_rice_parameter_search_dist(const FLAC__StreamEncoder *encoder); cannam@86: 01396 cannam@86: 01408 FLAC_API FLAC__uint64 FLAC__stream_encoder_get_total_samples_estimate(const FLAC__StreamEncoder *encoder); cannam@86: 01409 cannam@86: 01471 FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_stream(FLAC__StreamEncoder *encoder, FLAC__StreamEncoderWriteCallback write_callback, FLAC__StreamEncoderSeekCallback seek_callback, FLAC__StreamEncoderTellCallback tell_callback, FLAC__StreamEncoderMetadataCallback metadata_callback, void *client_data); cannam@86: 01472 cannam@86: 01539 FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_ogg_stream(FLAC__StreamEncoder *encoder, FLAC__StreamEncoderReadCallback read_callback, FLAC__StreamEncoderWriteCallback write_callback, FLAC__StreamEncoderSeekCallback seek_callback, FLAC__StreamEncoderTellCallback tell_callback, FLAC__StreamEncoderMetadataCallback metadata_callback, void *client_data); cannam@86: 01540 cannam@86: 01574 FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_FILE(FLAC__StreamEncoder *encoder, FILE *file, FLAC__StreamEncoderProgressCallback progress_callback, void *client_data); cannam@86: 01575 cannam@86: 01609 FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_ogg_FILE(FLAC__StreamEncoder *encoder, FILE *file, FLAC__StreamEncoderProgressCallback progress_callback, void *client_data); cannam@86: 01610 cannam@86: 01641 FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_file(FLAC__StreamEncoder *encoder, const char *filename, FLAC__StreamEncoderProgressCallback progress_callback, void *client_data); cannam@86: 01642 cannam@86: 01673 FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_ogg_file(FLAC__StreamEncoder *encoder, const char *filename, FLAC__StreamEncoderProgressCallback progress_callback, void *client_data); cannam@86: 01674 cannam@86: 01701 FLAC_API FLAC__bool FLAC__stream_encoder_finish(FLAC__StreamEncoder *encoder); cannam@86: 01702 cannam@86: 01728 FLAC_API FLAC__bool FLAC__stream_encoder_process(FLAC__StreamEncoder *encoder, const FLAC__int32 * const buffer[], unsigned samples); cannam@86: 01729 cannam@86: 01760 FLAC_API FLAC__bool FLAC__stream_encoder_process_interleaved(FLAC__StreamEncoder *encoder, const FLAC__int32 buffer[], unsigned samples); cannam@86: 01761 cannam@86: 01762 /* \} */ cannam@86: 01763 cannam@86: 01764 #ifdef __cplusplus cannam@86: 01765 } cannam@86: 01766 #endif cannam@86: 01767 cannam@86: 01768 #endif cannam@86: