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