stream_encoder.c revision c74663799493f2b1e6123c18def94295d0afab7b
1/* libFLAC - Free Lossless Audio Codec library
2 * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007  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#if HAVE_CONFIG_H
33#  include <config.h>
34#endif
35
36#if defined _MSC_VER || defined __MINGW32__
37#include <io.h> /* for _setmode() */
38#include <fcntl.h> /* for _O_BINARY */
39#endif
40#if defined __CYGWIN__ || defined __EMX__
41#include <io.h> /* for setmode(), O_BINARY */
42#include <fcntl.h> /* for _O_BINARY */
43#endif
44#include <limits.h>
45#include <stdio.h>
46#include <stdlib.h> /* for malloc() */
47#include <string.h> /* for memcpy() */
48#include <sys/types.h> /* for off_t */
49#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__
50#if _MSC_VER <= 1600 || defined __BORLANDC__ /* @@@ [2G limit] */
51#define fseeko fseek
52#define ftello ftell
53#endif
54#endif
55#include "FLAC/assert.h"
56#include "FLAC/stream_decoder.h"
57#include "share/alloc.h"
58#include "protected/stream_encoder.h"
59#include "private/bitwriter.h"
60#include "private/bitmath.h"
61#include "private/crc.h"
62#include "private/cpu.h"
63#include "private/fixed.h"
64#include "private/format.h"
65#include "private/lpc.h"
66#include "private/md5.h"
67#include "private/memory.h"
68#if FLAC__HAS_OGG
69#include "private/ogg_helper.h"
70#include "private/ogg_mapping.h"
71#endif
72#include "private/stream_encoder_framing.h"
73#include "private/window.h"
74
75#ifndef FLaC__INLINE
76#define FLaC__INLINE
77#endif
78
79#ifdef min
80#undef min
81#endif
82#define min(x,y) ((x)<(y)?(x):(y))
83
84#ifdef max
85#undef max
86#endif
87#define max(x,y) ((x)>(y)?(x):(y))
88
89/* Exact Rice codeword length calculation is off by default.  The simple
90 * (and fast) estimation (of how many bits a residual value will be
91 * encoded with) in this encoder is very good, almost always yielding
92 * compression within 0.1% of exact calculation.
93 */
94#undef EXACT_RICE_BITS_CALCULATION
95/* Rice parameter searching is off by default.  The simple (and fast)
96 * parameter estimation in this encoder is very good, almost always
97 * yielding compression within 0.1% of the optimal parameters.
98 */
99#undef ENABLE_RICE_PARAMETER_SEARCH
100
101
102typedef struct {
103	FLAC__int32 *data[FLAC__MAX_CHANNELS];
104	unsigned size; /* of each data[] in samples */
105	unsigned tail;
106} verify_input_fifo;
107
108typedef struct {
109	const FLAC__byte *data;
110	unsigned capacity;
111	unsigned bytes;
112} verify_output;
113
114typedef enum {
115	ENCODER_IN_MAGIC = 0,
116	ENCODER_IN_METADATA = 1,
117	ENCODER_IN_AUDIO = 2
118} EncoderStateHint;
119
120static struct CompressionLevels {
121	FLAC__bool do_mid_side_stereo;
122	FLAC__bool loose_mid_side_stereo;
123	unsigned max_lpc_order;
124	unsigned qlp_coeff_precision;
125	FLAC__bool do_qlp_coeff_prec_search;
126	FLAC__bool do_escape_coding;
127	FLAC__bool do_exhaustive_model_search;
128	unsigned min_residual_partition_order;
129	unsigned max_residual_partition_order;
130	unsigned rice_parameter_search_dist;
131} compression_levels_[] = {
132	{ false, false,  0, 0, false, false, false, 0, 3, 0 },
133	{ true , true ,  0, 0, false, false, false, 0, 3, 0 },
134	{ true , false,  0, 0, false, false, false, 0, 3, 0 },
135	{ false, false,  6, 0, false, false, false, 0, 4, 0 },
136	{ true , true ,  8, 0, false, false, false, 0, 4, 0 },
137	{ true , false,  8, 0, false, false, false, 0, 5, 0 },
138	{ true , false,  8, 0, false, false, false, 0, 6, 0 },
139	{ true , false,  8, 0, false, false, true , 0, 6, 0 },
140	{ true , false, 12, 0, false, false, true , 0, 6, 0 }
141};
142
143
144/***********************************************************************
145 *
146 * Private class method prototypes
147 *
148 ***********************************************************************/
149
150static void set_defaults_(FLAC__StreamEncoder *encoder);
151static void free_(FLAC__StreamEncoder *encoder);
152static FLAC__bool resize_buffers_(FLAC__StreamEncoder *encoder, unsigned new_blocksize);
153static FLAC__bool write_bitbuffer_(FLAC__StreamEncoder *encoder, unsigned samples, FLAC__bool is_last_block);
154static FLAC__StreamEncoderWriteStatus write_frame_(FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, FLAC__bool is_last_block);
155static void update_metadata_(const FLAC__StreamEncoder *encoder);
156#if FLAC__HAS_OGG
157static void update_ogg_metadata_(FLAC__StreamEncoder *encoder);
158#endif
159static FLAC__bool process_frame_(FLAC__StreamEncoder *encoder, FLAC__bool is_fractional_block, FLAC__bool is_last_block);
160static FLAC__bool process_subframes_(FLAC__StreamEncoder *encoder, FLAC__bool is_fractional_block);
161
162static FLAC__bool process_subframe_(
163	FLAC__StreamEncoder *encoder,
164	unsigned min_partition_order,
165	unsigned max_partition_order,
166	const FLAC__FrameHeader *frame_header,
167	unsigned subframe_bps,
168	const FLAC__int32 integer_signal[],
169	FLAC__Subframe *subframe[2],
170	FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents[2],
171	FLAC__int32 *residual[2],
172	unsigned *best_subframe,
173	unsigned *best_bits
174);
175
176static FLAC__bool add_subframe_(
177	FLAC__StreamEncoder *encoder,
178	unsigned blocksize,
179	unsigned subframe_bps,
180	const FLAC__Subframe *subframe,
181	FLAC__BitWriter *frame
182);
183
184static unsigned evaluate_constant_subframe_(
185	FLAC__StreamEncoder *encoder,
186	const FLAC__int32 signal,
187	unsigned blocksize,
188	unsigned subframe_bps,
189	FLAC__Subframe *subframe
190);
191
192static unsigned evaluate_fixed_subframe_(
193	FLAC__StreamEncoder *encoder,
194	const FLAC__int32 signal[],
195	FLAC__int32 residual[],
196	FLAC__uint64 abs_residual_partition_sums[],
197	unsigned raw_bits_per_partition[],
198	unsigned blocksize,
199	unsigned subframe_bps,
200	unsigned order,
201	unsigned rice_parameter,
202	unsigned rice_parameter_limit,
203	unsigned min_partition_order,
204	unsigned max_partition_order,
205	FLAC__bool do_escape_coding,
206	unsigned rice_parameter_search_dist,
207	FLAC__Subframe *subframe,
208	FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents
209);
210
211#ifndef FLAC__INTEGER_ONLY_LIBRARY
212static unsigned evaluate_lpc_subframe_(
213	FLAC__StreamEncoder *encoder,
214	const FLAC__int32 signal[],
215	FLAC__int32 residual[],
216	FLAC__uint64 abs_residual_partition_sums[],
217	unsigned raw_bits_per_partition[],
218	const FLAC__real lp_coeff[],
219	unsigned blocksize,
220	unsigned subframe_bps,
221	unsigned order,
222	unsigned qlp_coeff_precision,
223	unsigned rice_parameter,
224	unsigned rice_parameter_limit,
225	unsigned min_partition_order,
226	unsigned max_partition_order,
227	FLAC__bool do_escape_coding,
228	unsigned rice_parameter_search_dist,
229	FLAC__Subframe *subframe,
230	FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents
231);
232#endif
233
234static unsigned evaluate_verbatim_subframe_(
235	FLAC__StreamEncoder *encoder,
236	const FLAC__int32 signal[],
237	unsigned blocksize,
238	unsigned subframe_bps,
239	FLAC__Subframe *subframe
240);
241
242static unsigned find_best_partition_order_(
243	struct FLAC__StreamEncoderPrivate *private_,
244	const FLAC__int32 residual[],
245	FLAC__uint64 abs_residual_partition_sums[],
246	unsigned raw_bits_per_partition[],
247	unsigned residual_samples,
248	unsigned predictor_order,
249	unsigned rice_parameter,
250	unsigned rice_parameter_limit,
251	unsigned min_partition_order,
252	unsigned max_partition_order,
253	unsigned bps,
254	FLAC__bool do_escape_coding,
255	unsigned rice_parameter_search_dist,
256	FLAC__EntropyCodingMethod *best_ecm
257);
258
259static void precompute_partition_info_sums_(
260	const FLAC__int32 residual[],
261	FLAC__uint64 abs_residual_partition_sums[],
262	unsigned residual_samples,
263	unsigned predictor_order,
264	unsigned min_partition_order,
265	unsigned max_partition_order,
266	unsigned bps
267);
268
269static void precompute_partition_info_escapes_(
270	const FLAC__int32 residual[],
271	unsigned raw_bits_per_partition[],
272	unsigned residual_samples,
273	unsigned predictor_order,
274	unsigned min_partition_order,
275	unsigned max_partition_order
276);
277
278static FLAC__bool set_partitioned_rice_(
279#ifdef EXACT_RICE_BITS_CALCULATION
280	const FLAC__int32 residual[],
281#endif
282	const FLAC__uint64 abs_residual_partition_sums[],
283	const unsigned raw_bits_per_partition[],
284	const unsigned residual_samples,
285	const unsigned predictor_order,
286	const unsigned suggested_rice_parameter,
287	const unsigned rice_parameter_limit,
288	const unsigned rice_parameter_search_dist,
289	const unsigned partition_order,
290	const FLAC__bool search_for_escapes,
291	FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents,
292	unsigned *bits
293);
294
295static unsigned get_wasted_bits_(FLAC__int32 signal[], unsigned samples);
296
297/* verify-related routines: */
298static void append_to_verify_fifo_(
299	verify_input_fifo *fifo,
300	const FLAC__int32 * const input[],
301	unsigned input_offset,
302	unsigned channels,
303	unsigned wide_samples
304);
305
306static void append_to_verify_fifo_interleaved_(
307	verify_input_fifo *fifo,
308	const FLAC__int32 input[],
309	unsigned input_offset,
310	unsigned channels,
311	unsigned wide_samples
312);
313
314static FLAC__StreamDecoderReadStatus verify_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data);
315static FLAC__StreamDecoderWriteStatus verify_write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data);
316static void verify_metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data);
317static void verify_error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data);
318
319static FLAC__StreamEncoderReadStatus file_read_callback_(const FLAC__StreamEncoder *encoder, FLAC__byte buffer[], size_t *bytes, void *client_data);
320static FLAC__StreamEncoderSeekStatus file_seek_callback_(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data);
321static FLAC__StreamEncoderTellStatus file_tell_callback_(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data);
322static FLAC__StreamEncoderWriteStatus file_write_callback_(const FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data);
323static FILE *get_binary_stdout_(void);
324
325
326/***********************************************************************
327 *
328 * Private class data
329 *
330 ***********************************************************************/
331
332typedef struct FLAC__StreamEncoderPrivate {
333	unsigned input_capacity;                          /* current size (in samples) of the signal and residual buffers */
334	FLAC__int32 *integer_signal[FLAC__MAX_CHANNELS];  /* the integer version of the input signal */
335	FLAC__int32 *integer_signal_mid_side[2];          /* the integer version of the mid-side input signal (stereo only) */
336#ifndef FLAC__INTEGER_ONLY_LIBRARY
337	FLAC__real *real_signal[FLAC__MAX_CHANNELS];      /* (@@@ currently unused) the floating-point version of the input signal */
338	FLAC__real *real_signal_mid_side[2];              /* (@@@ currently unused) the floating-point version of the mid-side input signal (stereo only) */
339	FLAC__real *window[FLAC__MAX_APODIZATION_FUNCTIONS]; /* the pre-computed floating-point window for each apodization function */
340	FLAC__real *windowed_signal;                      /* the integer_signal[] * current window[] */
341#endif
342	unsigned subframe_bps[FLAC__MAX_CHANNELS];        /* the effective bits per sample of the input signal (stream bps - wasted bits) */
343	unsigned subframe_bps_mid_side[2];                /* the effective bits per sample of the mid-side input signal (stream bps - wasted bits + 0/1) */
344	FLAC__int32 *residual_workspace[FLAC__MAX_CHANNELS][2]; /* each channel has a candidate and best workspace where the subframe residual signals will be stored */
345	FLAC__int32 *residual_workspace_mid_side[2][2];
346	FLAC__Subframe subframe_workspace[FLAC__MAX_CHANNELS][2];
347	FLAC__Subframe subframe_workspace_mid_side[2][2];
348	FLAC__Subframe *subframe_workspace_ptr[FLAC__MAX_CHANNELS][2];
349	FLAC__Subframe *subframe_workspace_ptr_mid_side[2][2];
350	FLAC__EntropyCodingMethod_PartitionedRiceContents partitioned_rice_contents_workspace[FLAC__MAX_CHANNELS][2];
351	FLAC__EntropyCodingMethod_PartitionedRiceContents partitioned_rice_contents_workspace_mid_side[FLAC__MAX_CHANNELS][2];
352	FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents_workspace_ptr[FLAC__MAX_CHANNELS][2];
353	FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents_workspace_ptr_mid_side[FLAC__MAX_CHANNELS][2];
354	unsigned best_subframe[FLAC__MAX_CHANNELS];       /* index (0 or 1) into 2nd dimension of the above workspaces */
355	unsigned best_subframe_mid_side[2];
356	unsigned best_subframe_bits[FLAC__MAX_CHANNELS];  /* size in bits of the best subframe for each channel */
357	unsigned best_subframe_bits_mid_side[2];
358	FLAC__uint64 *abs_residual_partition_sums;        /* workspace where the sum of abs(candidate residual) for each partition is stored */
359	unsigned *raw_bits_per_partition;                 /* workspace where the sum of silog2(candidate residual) for each partition is stored */
360	FLAC__BitWriter *frame;                           /* the current frame being worked on */
361	unsigned loose_mid_side_stereo_frames;            /* rounded number of frames the encoder will use before trying both independent and mid/side frames again */
362	unsigned loose_mid_side_stereo_frame_count;       /* number of frames using the current channel assignment */
363	FLAC__ChannelAssignment last_channel_assignment;
364	FLAC__StreamMetadata streaminfo;                  /* scratchpad for STREAMINFO as it is built */
365	FLAC__StreamMetadata_SeekTable *seek_table;       /* pointer into encoder->protected_->metadata_ where the seek table is */
366	unsigned current_sample_number;
367	unsigned current_frame_number;
368	FLAC__MD5Context md5context;
369	FLAC__CPUInfo cpuinfo;
370#ifndef FLAC__INTEGER_ONLY_LIBRARY
371	unsigned (*local_fixed_compute_best_predictor)(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]);
372#else
373	unsigned (*local_fixed_compute_best_predictor)(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]);
374#endif
375#ifndef FLAC__INTEGER_ONLY_LIBRARY
376	void (*local_lpc_compute_autocorrelation)(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]);
377	void (*local_lpc_compute_residual_from_qlp_coefficients)(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]);
378	void (*local_lpc_compute_residual_from_qlp_coefficients_64bit)(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]);
379	void (*local_lpc_compute_residual_from_qlp_coefficients_16bit)(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]);
380#endif
381	FLAC__bool use_wide_by_block;          /* use slow 64-bit versions of some functions because of the block size */
382	FLAC__bool use_wide_by_partition;      /* use slow 64-bit versions of some functions because of the min partition order and blocksize */
383	FLAC__bool use_wide_by_order;          /* use slow 64-bit versions of some functions because of the lpc order */
384	FLAC__bool disable_constant_subframes;
385	FLAC__bool disable_fixed_subframes;
386	FLAC__bool disable_verbatim_subframes;
387#if FLAC__HAS_OGG
388	FLAC__bool is_ogg;
389#endif
390	FLAC__StreamEncoderReadCallback read_callback; /* currently only needed for Ogg FLAC */
391	FLAC__StreamEncoderSeekCallback seek_callback;
392	FLAC__StreamEncoderTellCallback tell_callback;
393	FLAC__StreamEncoderWriteCallback write_callback;
394	FLAC__StreamEncoderMetadataCallback metadata_callback;
395	FLAC__StreamEncoderProgressCallback progress_callback;
396	void *client_data;
397	unsigned first_seekpoint_to_check;
398	FILE *file;                            /* only used when encoding to a file */
399	FLAC__uint64 bytes_written;
400	FLAC__uint64 samples_written;
401	unsigned frames_written;
402	unsigned total_frames_estimate;
403	/* unaligned (original) pointers to allocated data */
404	FLAC__int32 *integer_signal_unaligned[FLAC__MAX_CHANNELS];
405	FLAC__int32 *integer_signal_mid_side_unaligned[2];
406#ifndef FLAC__INTEGER_ONLY_LIBRARY
407	FLAC__real *real_signal_unaligned[FLAC__MAX_CHANNELS]; /* (@@@ currently unused) */
408	FLAC__real *real_signal_mid_side_unaligned[2]; /* (@@@ currently unused) */
409	FLAC__real *window_unaligned[FLAC__MAX_APODIZATION_FUNCTIONS];
410	FLAC__real *windowed_signal_unaligned;
411#endif
412	FLAC__int32 *residual_workspace_unaligned[FLAC__MAX_CHANNELS][2];
413	FLAC__int32 *residual_workspace_mid_side_unaligned[2][2];
414	FLAC__uint64 *abs_residual_partition_sums_unaligned;
415	unsigned *raw_bits_per_partition_unaligned;
416	/*
417	 * These fields have been moved here from private function local
418	 * declarations merely to save stack space during encoding.
419	 */
420#ifndef FLAC__INTEGER_ONLY_LIBRARY
421	FLAC__real lp_coeff[FLAC__MAX_LPC_ORDER][FLAC__MAX_LPC_ORDER]; /* from process_subframe_() */
422#endif
423	FLAC__EntropyCodingMethod_PartitionedRiceContents partitioned_rice_contents_extra[2]; /* from find_best_partition_order_() */
424	/*
425	 * The data for the verify section
426	 */
427	struct {
428		FLAC__StreamDecoder *decoder;
429		EncoderStateHint state_hint;
430		FLAC__bool needs_magic_hack;
431		verify_input_fifo input_fifo;
432		verify_output output;
433		struct {
434			FLAC__uint64 absolute_sample;
435			unsigned frame_number;
436			unsigned channel;
437			unsigned sample;
438			FLAC__int32 expected;
439			FLAC__int32 got;
440		} error_stats;
441	} verify;
442	FLAC__bool is_being_deleted; /* if true, call to ..._finish() from ..._delete() will not call the callbacks */
443} FLAC__StreamEncoderPrivate;
444
445/***********************************************************************
446 *
447 * Public static class data
448 *
449 ***********************************************************************/
450
451FLAC_API const char * const FLAC__StreamEncoderStateString[] = {
452	"FLAC__STREAM_ENCODER_OK",
453	"FLAC__STREAM_ENCODER_UNINITIALIZED",
454	"FLAC__STREAM_ENCODER_OGG_ERROR",
455	"FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR",
456	"FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA",
457	"FLAC__STREAM_ENCODER_CLIENT_ERROR",
458	"FLAC__STREAM_ENCODER_IO_ERROR",
459	"FLAC__STREAM_ENCODER_FRAMING_ERROR",
460	"FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR"
461};
462
463FLAC_API const char * const FLAC__StreamEncoderInitStatusString[] = {
464	"FLAC__STREAM_ENCODER_INIT_STATUS_OK",
465	"FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR",
466	"FLAC__STREAM_ENCODER_INIT_STATUS_UNSUPPORTED_CONTAINER",
467	"FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_CALLBACKS",
468	"FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_NUMBER_OF_CHANNELS",
469	"FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BITS_PER_SAMPLE",
470	"FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_SAMPLE_RATE",
471	"FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BLOCK_SIZE",
472	"FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_MAX_LPC_ORDER",
473	"FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_QLP_COEFF_PRECISION",
474	"FLAC__STREAM_ENCODER_INIT_STATUS_BLOCK_SIZE_TOO_SMALL_FOR_LPC_ORDER",
475	"FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE",
476	"FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA",
477	"FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED"
478};
479
480FLAC_API const char * const FLAC__treamEncoderReadStatusString[] = {
481	"FLAC__STREAM_ENCODER_READ_STATUS_CONTINUE",
482	"FLAC__STREAM_ENCODER_READ_STATUS_END_OF_STREAM",
483	"FLAC__STREAM_ENCODER_READ_STATUS_ABORT",
484	"FLAC__STREAM_ENCODER_READ_STATUS_UNSUPPORTED"
485};
486
487FLAC_API const char * const FLAC__StreamEncoderWriteStatusString[] = {
488	"FLAC__STREAM_ENCODER_WRITE_STATUS_OK",
489	"FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR"
490};
491
492FLAC_API const char * const FLAC__StreamEncoderSeekStatusString[] = {
493	"FLAC__STREAM_ENCODER_SEEK_STATUS_OK",
494	"FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR",
495	"FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED"
496};
497
498FLAC_API const char * const FLAC__StreamEncoderTellStatusString[] = {
499	"FLAC__STREAM_ENCODER_TELL_STATUS_OK",
500	"FLAC__STREAM_ENCODER_TELL_STATUS_ERROR",
501	"FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED"
502};
503
504/* Number of samples that will be overread to watch for end of stream.  By
505 * 'overread', we mean that the FLAC__stream_encoder_process*() calls will
506 * always try to read blocksize+1 samples before encoding a block, so that
507 * even if the stream has a total sample count that is an integral multiple
508 * of the blocksize, we will still notice when we are encoding the last
509 * block.  This is needed, for example, to correctly set the end-of-stream
510 * marker in Ogg FLAC.
511 *
512 * WATCHOUT: some parts of the code assert that OVERREAD_ == 1 and there's
513 * not really any reason to change it.
514 */
515static const unsigned OVERREAD_ = 1;
516
517/***********************************************************************
518 *
519 * Class constructor/destructor
520 *
521 */
522FLAC_API FLAC__StreamEncoder *FLAC__stream_encoder_new(void)
523{
524	FLAC__StreamEncoder *encoder;
525	unsigned i;
526
527	FLAC__ASSERT(sizeof(int) >= 4); /* we want to die right away if this is not true */
528
529	encoder = (FLAC__StreamEncoder*)calloc(1, sizeof(FLAC__StreamEncoder));
530	if(encoder == 0) {
531		return 0;
532	}
533
534	encoder->protected_ = (FLAC__StreamEncoderProtected*)calloc(1, sizeof(FLAC__StreamEncoderProtected));
535	if(encoder->protected_ == 0) {
536		free(encoder);
537		return 0;
538	}
539
540	encoder->private_ = (FLAC__StreamEncoderPrivate*)calloc(1, sizeof(FLAC__StreamEncoderPrivate));
541	if(encoder->private_ == 0) {
542		free(encoder->protected_);
543		free(encoder);
544		return 0;
545	}
546
547	encoder->private_->frame = FLAC__bitwriter_new();
548	if(encoder->private_->frame == 0) {
549		free(encoder->private_);
550		free(encoder->protected_);
551		free(encoder);
552		return 0;
553	}
554
555	encoder->private_->file = 0;
556
557	set_defaults_(encoder);
558
559	encoder->private_->is_being_deleted = false;
560
561	for(i = 0; i < FLAC__MAX_CHANNELS; i++) {
562		encoder->private_->subframe_workspace_ptr[i][0] = &encoder->private_->subframe_workspace[i][0];
563		encoder->private_->subframe_workspace_ptr[i][1] = &encoder->private_->subframe_workspace[i][1];
564	}
565	for(i = 0; i < 2; i++) {
566		encoder->private_->subframe_workspace_ptr_mid_side[i][0] = &encoder->private_->subframe_workspace_mid_side[i][0];
567		encoder->private_->subframe_workspace_ptr_mid_side[i][1] = &encoder->private_->subframe_workspace_mid_side[i][1];
568	}
569	for(i = 0; i < FLAC__MAX_CHANNELS; i++) {
570		encoder->private_->partitioned_rice_contents_workspace_ptr[i][0] = &encoder->private_->partitioned_rice_contents_workspace[i][0];
571		encoder->private_->partitioned_rice_contents_workspace_ptr[i][1] = &encoder->private_->partitioned_rice_contents_workspace[i][1];
572	}
573	for(i = 0; i < 2; i++) {
574		encoder->private_->partitioned_rice_contents_workspace_ptr_mid_side[i][0] = &encoder->private_->partitioned_rice_contents_workspace_mid_side[i][0];
575		encoder->private_->partitioned_rice_contents_workspace_ptr_mid_side[i][1] = &encoder->private_->partitioned_rice_contents_workspace_mid_side[i][1];
576	}
577
578	for(i = 0; i < FLAC__MAX_CHANNELS; i++) {
579		FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_workspace[i][0]);
580		FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_workspace[i][1]);
581	}
582	for(i = 0; i < 2; i++) {
583		FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_workspace_mid_side[i][0]);
584		FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_workspace_mid_side[i][1]);
585	}
586	for(i = 0; i < 2; i++)
587		FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_extra[i]);
588
589	encoder->protected_->state = FLAC__STREAM_ENCODER_UNINITIALIZED;
590
591	return encoder;
592}
593
594FLAC_API void FLAC__stream_encoder_delete(FLAC__StreamEncoder *encoder)
595{
596	unsigned i;
597
598	FLAC__ASSERT(0 != encoder);
599	FLAC__ASSERT(0 != encoder->protected_);
600	FLAC__ASSERT(0 != encoder->private_);
601	FLAC__ASSERT(0 != encoder->private_->frame);
602
603	encoder->private_->is_being_deleted = true;
604
605	(void)FLAC__stream_encoder_finish(encoder);
606
607	if(0 != encoder->private_->verify.decoder)
608		FLAC__stream_decoder_delete(encoder->private_->verify.decoder);
609
610	for(i = 0; i < FLAC__MAX_CHANNELS; i++) {
611		FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_workspace[i][0]);
612		FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_workspace[i][1]);
613	}
614	for(i = 0; i < 2; i++) {
615		FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_workspace_mid_side[i][0]);
616		FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_workspace_mid_side[i][1]);
617	}
618	for(i = 0; i < 2; i++)
619		FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_extra[i]);
620
621	FLAC__bitwriter_delete(encoder->private_->frame);
622	free(encoder->private_);
623	free(encoder->protected_);
624	free(encoder);
625}
626
627/***********************************************************************
628 *
629 * Public class methods
630 *
631 ***********************************************************************/
632
633static FLAC__StreamEncoderInitStatus init_stream_internal_(
634	FLAC__StreamEncoder *encoder,
635	FLAC__StreamEncoderReadCallback read_callback,
636	FLAC__StreamEncoderWriteCallback write_callback,
637	FLAC__StreamEncoderSeekCallback seek_callback,
638	FLAC__StreamEncoderTellCallback tell_callback,
639	FLAC__StreamEncoderMetadataCallback metadata_callback,
640	void *client_data,
641	FLAC__bool is_ogg
642)
643{
644	unsigned i;
645	FLAC__bool metadata_has_seektable, metadata_has_vorbis_comment, metadata_picture_has_type1, metadata_picture_has_type2;
646
647	FLAC__ASSERT(0 != encoder);
648
649	if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
650		return FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED;
651
652#if !FLAC__HAS_OGG
653	if(is_ogg)
654		return FLAC__STREAM_ENCODER_INIT_STATUS_UNSUPPORTED_CONTAINER;
655#endif
656
657	if(0 == write_callback || (seek_callback && 0 == tell_callback))
658		return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_CALLBACKS;
659
660	if(encoder->protected_->channels == 0 || encoder->protected_->channels > FLAC__MAX_CHANNELS)
661		return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_NUMBER_OF_CHANNELS;
662
663	if(encoder->protected_->channels != 2) {
664		encoder->protected_->do_mid_side_stereo = false;
665		encoder->protected_->loose_mid_side_stereo = false;
666	}
667	else if(!encoder->protected_->do_mid_side_stereo)
668		encoder->protected_->loose_mid_side_stereo = false;
669
670	if(encoder->protected_->bits_per_sample >= 32)
671		encoder->protected_->do_mid_side_stereo = false; /* since we currenty do 32-bit math, the side channel would have 33 bps and overflow */
672
673	if(encoder->protected_->bits_per_sample < FLAC__MIN_BITS_PER_SAMPLE || encoder->protected_->bits_per_sample > FLAC__REFERENCE_CODEC_MAX_BITS_PER_SAMPLE)
674		return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BITS_PER_SAMPLE;
675
676	if(!FLAC__format_sample_rate_is_valid(encoder->protected_->sample_rate))
677		return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_SAMPLE_RATE;
678
679	if(encoder->protected_->blocksize == 0) {
680		if(encoder->protected_->max_lpc_order == 0)
681			encoder->protected_->blocksize = 1152;
682		else
683			encoder->protected_->blocksize = 4096;
684	}
685
686	if(encoder->protected_->blocksize < FLAC__MIN_BLOCK_SIZE || encoder->protected_->blocksize > FLAC__MAX_BLOCK_SIZE)
687		return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BLOCK_SIZE;
688
689	if(encoder->protected_->max_lpc_order > FLAC__MAX_LPC_ORDER)
690		return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_MAX_LPC_ORDER;
691
692	if(encoder->protected_->blocksize < encoder->protected_->max_lpc_order)
693		return FLAC__STREAM_ENCODER_INIT_STATUS_BLOCK_SIZE_TOO_SMALL_FOR_LPC_ORDER;
694
695	if(encoder->protected_->qlp_coeff_precision == 0) {
696		if(encoder->protected_->bits_per_sample < 16) {
697			/* @@@ need some data about how to set this here w.r.t. blocksize and sample rate */
698			/* @@@ until then we'll make a guess */
699			encoder->protected_->qlp_coeff_precision = max(FLAC__MIN_QLP_COEFF_PRECISION, 2 + encoder->protected_->bits_per_sample / 2);
700		}
701		else if(encoder->protected_->bits_per_sample == 16) {
702			if(encoder->protected_->blocksize <= 192)
703				encoder->protected_->qlp_coeff_precision = 7;
704			else if(encoder->protected_->blocksize <= 384)
705				encoder->protected_->qlp_coeff_precision = 8;
706			else if(encoder->protected_->blocksize <= 576)
707				encoder->protected_->qlp_coeff_precision = 9;
708			else if(encoder->protected_->blocksize <= 1152)
709				encoder->protected_->qlp_coeff_precision = 10;
710			else if(encoder->protected_->blocksize <= 2304)
711				encoder->protected_->qlp_coeff_precision = 11;
712			else if(encoder->protected_->blocksize <= 4608)
713				encoder->protected_->qlp_coeff_precision = 12;
714			else
715				encoder->protected_->qlp_coeff_precision = 13;
716		}
717		else {
718			if(encoder->protected_->blocksize <= 384)
719				encoder->protected_->qlp_coeff_precision = FLAC__MAX_QLP_COEFF_PRECISION-2;
720			else if(encoder->protected_->blocksize <= 1152)
721				encoder->protected_->qlp_coeff_precision = FLAC__MAX_QLP_COEFF_PRECISION-1;
722			else
723				encoder->protected_->qlp_coeff_precision = FLAC__MAX_QLP_COEFF_PRECISION;
724		}
725		FLAC__ASSERT(encoder->protected_->qlp_coeff_precision <= FLAC__MAX_QLP_COEFF_PRECISION);
726	}
727	else if(encoder->protected_->qlp_coeff_precision < FLAC__MIN_QLP_COEFF_PRECISION || encoder->protected_->qlp_coeff_precision > FLAC__MAX_QLP_COEFF_PRECISION)
728		return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_QLP_COEFF_PRECISION;
729
730	if(encoder->protected_->streamable_subset) {
731		if(
732			encoder->protected_->blocksize != 192 &&
733			encoder->protected_->blocksize != 576 &&
734			encoder->protected_->blocksize != 1152 &&
735			encoder->protected_->blocksize != 2304 &&
736			encoder->protected_->blocksize != 4608 &&
737			encoder->protected_->blocksize != 256 &&
738			encoder->protected_->blocksize != 512 &&
739			encoder->protected_->blocksize != 1024 &&
740			encoder->protected_->blocksize != 2048 &&
741			encoder->protected_->blocksize != 4096 &&
742			encoder->protected_->blocksize != 8192 &&
743			encoder->protected_->blocksize != 16384
744		)
745			return FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE;
746		if(!FLAC__format_sample_rate_is_subset(encoder->protected_->sample_rate))
747			return FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE;
748		if(
749			encoder->protected_->bits_per_sample != 8 &&
750			encoder->protected_->bits_per_sample != 12 &&
751			encoder->protected_->bits_per_sample != 16 &&
752			encoder->protected_->bits_per_sample != 20 &&
753			encoder->protected_->bits_per_sample != 24
754		)
755			return FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE;
756		if(encoder->protected_->max_residual_partition_order > FLAC__SUBSET_MAX_RICE_PARTITION_ORDER)
757			return FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE;
758		if(
759			encoder->protected_->sample_rate <= 48000 &&
760			(
761				encoder->protected_->blocksize > FLAC__SUBSET_MAX_BLOCK_SIZE_48000HZ ||
762				encoder->protected_->max_lpc_order > FLAC__SUBSET_MAX_LPC_ORDER_48000HZ
763			)
764		) {
765			return FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE;
766		}
767	}
768
769	if(encoder->protected_->max_residual_partition_order >= (1u << FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN))
770		encoder->protected_->max_residual_partition_order = (1u << FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN) - 1;
771	if(encoder->protected_->min_residual_partition_order >= encoder->protected_->max_residual_partition_order)
772		encoder->protected_->min_residual_partition_order = encoder->protected_->max_residual_partition_order;
773
774#if FLAC__HAS_OGG
775	/* reorder metadata if necessary to ensure that any VORBIS_COMMENT is the first, according to the mapping spec */
776	if(is_ogg && 0 != encoder->protected_->metadata && encoder->protected_->num_metadata_blocks > 1) {
777		unsigned i;
778		for(i = 1; i < encoder->protected_->num_metadata_blocks; i++) {
779			if(0 != encoder->protected_->metadata[i] && encoder->protected_->metadata[i]->type == FLAC__METADATA_TYPE_VORBIS_COMMENT) {
780				FLAC__StreamMetadata *vc = encoder->protected_->metadata[i];
781				for( ; i > 0; i--)
782					encoder->protected_->metadata[i] = encoder->protected_->metadata[i-1];
783				encoder->protected_->metadata[0] = vc;
784				break;
785			}
786		}
787	}
788#endif
789	/* keep track of any SEEKTABLE block */
790	if(0 != encoder->protected_->metadata && encoder->protected_->num_metadata_blocks > 0) {
791		unsigned i;
792		for(i = 0; i < encoder->protected_->num_metadata_blocks; i++) {
793			if(0 != encoder->protected_->metadata[i] && encoder->protected_->metadata[i]->type == FLAC__METADATA_TYPE_SEEKTABLE) {
794				encoder->private_->seek_table = &encoder->protected_->metadata[i]->data.seek_table;
795				break; /* take only the first one */
796			}
797		}
798	}
799
800	/* validate metadata */
801	if(0 == encoder->protected_->metadata && encoder->protected_->num_metadata_blocks > 0)
802		return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA;
803	metadata_has_seektable = false;
804	metadata_has_vorbis_comment = false;
805	metadata_picture_has_type1 = false;
806	metadata_picture_has_type2 = false;
807	for(i = 0; i < encoder->protected_->num_metadata_blocks; i++) {
808		const FLAC__StreamMetadata *m = encoder->protected_->metadata[i];
809		if(m->type == FLAC__METADATA_TYPE_STREAMINFO)
810			return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA;
811		else if(m->type == FLAC__METADATA_TYPE_SEEKTABLE) {
812			if(metadata_has_seektable) /* only one is allowed */
813				return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA;
814			metadata_has_seektable = true;
815			if(!FLAC__format_seektable_is_legal(&m->data.seek_table))
816				return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA;
817		}
818		else if(m->type == FLAC__METADATA_TYPE_VORBIS_COMMENT) {
819			if(metadata_has_vorbis_comment) /* only one is allowed */
820				return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA;
821			metadata_has_vorbis_comment = true;
822		}
823		else if(m->type == FLAC__METADATA_TYPE_CUESHEET) {
824			if(!FLAC__format_cuesheet_is_legal(&m->data.cue_sheet, m->data.cue_sheet.is_cd, /*violation=*/0))
825				return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA;
826		}
827		else if(m->type == FLAC__METADATA_TYPE_PICTURE) {
828			if(!FLAC__format_picture_is_legal(&m->data.picture, /*violation=*/0))
829				return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA;
830			if(m->data.picture.type == FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON_STANDARD) {
831				if(metadata_picture_has_type1) /* there should only be 1 per stream */
832					return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA;
833				metadata_picture_has_type1 = true;
834				/* standard icon must be 32x32 pixel PNG */
835				if(
836					m->data.picture.type == FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON_STANDARD &&
837					(
838						(strcmp(m->data.picture.mime_type, "image/png") && strcmp(m->data.picture.mime_type, "-->")) ||
839						m->data.picture.width != 32 ||
840						m->data.picture.height != 32
841					)
842				)
843					return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA;
844			}
845			else if(m->data.picture.type == FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON) {
846				if(metadata_picture_has_type2) /* there should only be 1 per stream */
847					return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA;
848				metadata_picture_has_type2 = true;
849			}
850		}
851	}
852
853	encoder->private_->input_capacity = 0;
854	for(i = 0; i < encoder->protected_->channels; i++) {
855		encoder->private_->integer_signal_unaligned[i] = encoder->private_->integer_signal[i] = 0;
856#ifndef FLAC__INTEGER_ONLY_LIBRARY
857		encoder->private_->real_signal_unaligned[i] = encoder->private_->real_signal[i] = 0;
858#endif
859	}
860	for(i = 0; i < 2; i++) {
861		encoder->private_->integer_signal_mid_side_unaligned[i] = encoder->private_->integer_signal_mid_side[i] = 0;
862#ifndef FLAC__INTEGER_ONLY_LIBRARY
863		encoder->private_->real_signal_mid_side_unaligned[i] = encoder->private_->real_signal_mid_side[i] = 0;
864#endif
865	}
866#ifndef FLAC__INTEGER_ONLY_LIBRARY
867	for(i = 0; i < encoder->protected_->num_apodizations; i++)
868		encoder->private_->window_unaligned[i] = encoder->private_->window[i] = 0;
869	encoder->private_->windowed_signal_unaligned = encoder->private_->windowed_signal = 0;
870#endif
871	for(i = 0; i < encoder->protected_->channels; i++) {
872		encoder->private_->residual_workspace_unaligned[i][0] = encoder->private_->residual_workspace[i][0] = 0;
873		encoder->private_->residual_workspace_unaligned[i][1] = encoder->private_->residual_workspace[i][1] = 0;
874		encoder->private_->best_subframe[i] = 0;
875	}
876	for(i = 0; i < 2; i++) {
877		encoder->private_->residual_workspace_mid_side_unaligned[i][0] = encoder->private_->residual_workspace_mid_side[i][0] = 0;
878		encoder->private_->residual_workspace_mid_side_unaligned[i][1] = encoder->private_->residual_workspace_mid_side[i][1] = 0;
879		encoder->private_->best_subframe_mid_side[i] = 0;
880	}
881	encoder->private_->abs_residual_partition_sums_unaligned = encoder->private_->abs_residual_partition_sums = 0;
882	encoder->private_->raw_bits_per_partition_unaligned = encoder->private_->raw_bits_per_partition = 0;
883#ifndef FLAC__INTEGER_ONLY_LIBRARY
884	encoder->private_->loose_mid_side_stereo_frames = (unsigned)((FLAC__double)encoder->protected_->sample_rate * 0.4 / (FLAC__double)encoder->protected_->blocksize + 0.5);
885#else
886	/* 26214 is the approximate fixed-point equivalent to 0.4 (0.4 * 2^16) */
887	/* sample rate can be up to 655350 Hz, and thus use 20 bits, so we do the multiply&divide by hand */
888	FLAC__ASSERT(FLAC__MAX_SAMPLE_RATE <= 655350);
889	FLAC__ASSERT(FLAC__MAX_BLOCK_SIZE <= 65535);
890	FLAC__ASSERT(encoder->protected_->sample_rate <= 655350);
891	FLAC__ASSERT(encoder->protected_->blocksize <= 65535);
892	encoder->private_->loose_mid_side_stereo_frames = (unsigned)FLAC__fixedpoint_trunc((((FLAC__uint64)(encoder->protected_->sample_rate) * (FLAC__uint64)(26214)) << 16) / (encoder->protected_->blocksize<<16) + FLAC__FP_ONE_HALF);
893#endif
894	if(encoder->private_->loose_mid_side_stereo_frames == 0)
895		encoder->private_->loose_mid_side_stereo_frames = 1;
896	encoder->private_->loose_mid_side_stereo_frame_count = 0;
897	encoder->private_->current_sample_number = 0;
898	encoder->private_->current_frame_number = 0;
899
900	encoder->private_->use_wide_by_block = (encoder->protected_->bits_per_sample + FLAC__bitmath_ilog2(encoder->protected_->blocksize)+1 > 30);
901	encoder->private_->use_wide_by_order = (encoder->protected_->bits_per_sample + FLAC__bitmath_ilog2(max(encoder->protected_->max_lpc_order, FLAC__MAX_FIXED_ORDER))+1 > 30); /*@@@ need to use this? */
902	encoder->private_->use_wide_by_partition = (false); /*@@@ need to set this */
903
904	/*
905	 * get the CPU info and set the function pointers
906	 */
907	FLAC__cpu_info(&encoder->private_->cpuinfo);
908	/* first default to the non-asm routines */
909#ifndef FLAC__INTEGER_ONLY_LIBRARY
910	encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation;
911#endif
912	encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor;
913#ifndef FLAC__INTEGER_ONLY_LIBRARY
914	encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients;
915	encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit = FLAC__lpc_compute_residual_from_qlp_coefficients_wide;
916	encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients;
917#endif
918	/* now override with asm where appropriate */
919#ifndef FLAC__INTEGER_ONLY_LIBRARY
920# ifndef FLAC__NO_ASM
921	if(encoder->private_->cpuinfo.use_asm) {
922#  ifdef FLAC__CPU_IA32
923		FLAC__ASSERT(encoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_IA32);
924#   ifdef FLAC__HAS_NASM
925		if(encoder->private_->cpuinfo.data.ia32.sse) {
926			if(encoder->protected_->max_lpc_order < 4)
927				encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_4;
928			else if(encoder->protected_->max_lpc_order < 8)
929				encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_8;
930			else if(encoder->protected_->max_lpc_order < 12)
931				encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_12;
932			else
933				encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32;
934		}
935		else if(encoder->private_->cpuinfo.data.ia32._3dnow)
936			encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_3dnow;
937		else
938			encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32;
939		if(encoder->private_->cpuinfo.data.ia32.mmx) {
940			encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32;
941			encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx;
942		}
943		else {
944			encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32;
945			encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32;
946		}
947		if(encoder->private_->cpuinfo.data.ia32.mmx && encoder->private_->cpuinfo.data.ia32.cmov)
948			encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_asm_ia32_mmx_cmov;
949#   endif /* FLAC__HAS_NASM */
950#  endif /* FLAC__CPU_IA32 */
951	}
952# endif /* !FLAC__NO_ASM */
953#endif /* !FLAC__INTEGER_ONLY_LIBRARY */
954	/* finally override based on wide-ness if necessary */
955	if(encoder->private_->use_wide_by_block) {
956		encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_wide;
957	}
958
959	/* set state to OK; from here on, errors are fatal and we'll override the state then */
960	encoder->protected_->state = FLAC__STREAM_ENCODER_OK;
961
962#if FLAC__HAS_OGG
963	encoder->private_->is_ogg = is_ogg;
964	if(is_ogg && !FLAC__ogg_encoder_aspect_init(&encoder->protected_->ogg_encoder_aspect)) {
965		encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR;
966		return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR;
967	}
968#endif
969
970	encoder->private_->read_callback = read_callback;
971	encoder->private_->write_callback = write_callback;
972	encoder->private_->seek_callback = seek_callback;
973	encoder->private_->tell_callback = tell_callback;
974	encoder->private_->metadata_callback = metadata_callback;
975	encoder->private_->client_data = client_data;
976
977	if(!resize_buffers_(encoder, encoder->protected_->blocksize)) {
978		/* the above function sets the state for us in case of an error */
979		return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR;
980	}
981
982	if(!FLAC__bitwriter_init(encoder->private_->frame)) {
983		encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
984		return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR;
985	}
986
987	/*
988	 * Set up the verify stuff if necessary
989	 */
990	if(encoder->protected_->verify) {
991		/*
992		 * First, set up the fifo which will hold the
993		 * original signal to compare against
994		 */
995		encoder->private_->verify.input_fifo.size = encoder->protected_->blocksize+OVERREAD_;
996		for(i = 0; i < encoder->protected_->channels; i++) {
997			if(0 == (encoder->private_->verify.input_fifo.data[i] = (FLAC__int32*)safe_malloc_mul_2op_(sizeof(FLAC__int32), /*times*/encoder->private_->verify.input_fifo.size))) {
998				encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
999				return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR;
1000			}
1001		}
1002		encoder->private_->verify.input_fifo.tail = 0;
1003
1004		/*
1005		 * Now set up a stream decoder for verification
1006		 */
1007		encoder->private_->verify.decoder = FLAC__stream_decoder_new();
1008		if(0 == encoder->private_->verify.decoder) {
1009			encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR;
1010			return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR;
1011		}
1012
1013		if(FLAC__stream_decoder_init_stream(encoder->private_->verify.decoder, verify_read_callback_, /*seek_callback=*/0, /*tell_callback=*/0, /*length_callback=*/0, /*eof_callback=*/0, verify_write_callback_, verify_metadata_callback_, verify_error_callback_, /*client_data=*/encoder) != FLAC__STREAM_DECODER_INIT_STATUS_OK) {
1014			encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR;
1015			return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR;
1016		}
1017	}
1018	encoder->private_->verify.error_stats.absolute_sample = 0;
1019	encoder->private_->verify.error_stats.frame_number = 0;
1020	encoder->private_->verify.error_stats.channel = 0;
1021	encoder->private_->verify.error_stats.sample = 0;
1022	encoder->private_->verify.error_stats.expected = 0;
1023	encoder->private_->verify.error_stats.got = 0;
1024
1025	/*
1026	 * These must be done before we write any metadata, because that
1027	 * calls the write_callback, which uses these values.
1028	 */
1029	encoder->private_->first_seekpoint_to_check = 0;
1030	encoder->private_->samples_written = 0;
1031	encoder->protected_->streaminfo_offset = 0;
1032	encoder->protected_->seektable_offset = 0;
1033	encoder->protected_->audio_offset = 0;
1034
1035	/*
1036	 * write the stream header
1037	 */
1038	if(encoder->protected_->verify)
1039		encoder->private_->verify.state_hint = ENCODER_IN_MAGIC;
1040	if(!FLAC__bitwriter_write_raw_uint32(encoder->private_->frame, FLAC__STREAM_SYNC, FLAC__STREAM_SYNC_LEN)) {
1041		encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
1042		return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR;
1043	}
1044	if(!write_bitbuffer_(encoder, 0, /*is_last_block=*/false)) {
1045		/* the above function sets the state for us in case of an error */
1046		return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR;
1047	}
1048
1049	/*
1050	 * write the STREAMINFO metadata block
1051	 */
1052	if(encoder->protected_->verify)
1053		encoder->private_->verify.state_hint = ENCODER_IN_METADATA;
1054	encoder->private_->streaminfo.type = FLAC__METADATA_TYPE_STREAMINFO;
1055	encoder->private_->streaminfo.is_last = false; /* we will have at a minimum a VORBIS_COMMENT afterwards */
1056	encoder->private_->streaminfo.length = FLAC__STREAM_METADATA_STREAMINFO_LENGTH;
1057	encoder->private_->streaminfo.data.stream_info.min_blocksize = encoder->protected_->blocksize; /* this encoder uses the same blocksize for the whole stream */
1058	encoder->private_->streaminfo.data.stream_info.max_blocksize = encoder->protected_->blocksize;
1059	encoder->private_->streaminfo.data.stream_info.min_framesize = 0; /* we don't know this yet; have to fill it in later */
1060	encoder->private_->streaminfo.data.stream_info.max_framesize = 0; /* we don't know this yet; have to fill it in later */
1061	encoder->private_->streaminfo.data.stream_info.sample_rate = encoder->protected_->sample_rate;
1062	encoder->private_->streaminfo.data.stream_info.channels = encoder->protected_->channels;
1063	encoder->private_->streaminfo.data.stream_info.bits_per_sample = encoder->protected_->bits_per_sample;
1064	encoder->private_->streaminfo.data.stream_info.total_samples = encoder->protected_->total_samples_estimate; /* we will replace this later with the real total */
1065	memset(encoder->private_->streaminfo.data.stream_info.md5sum, 0, 16); /* we don't know this yet; have to fill it in later */
1066	if(encoder->protected_->do_md5)
1067		FLAC__MD5Init(&encoder->private_->md5context);
1068	if(!FLAC__add_metadata_block(&encoder->private_->streaminfo, encoder->private_->frame)) {
1069		encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
1070		return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR;
1071	}
1072	if(!write_bitbuffer_(encoder, 0, /*is_last_block=*/false)) {
1073		/* the above function sets the state for us in case of an error */
1074		return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR;
1075	}
1076
1077	/*
1078	 * Now that the STREAMINFO block is written, we can init this to an
1079	 * absurdly-high value...
1080	 */
1081	encoder->private_->streaminfo.data.stream_info.min_framesize = (1u << FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN) - 1;
1082	/* ... and clear this to 0 */
1083	encoder->private_->streaminfo.data.stream_info.total_samples = 0;
1084
1085	/*
1086	 * Check to see if the supplied metadata contains a VORBIS_COMMENT;
1087	 * if not, we will write an empty one (FLAC__add_metadata_block()
1088	 * automatically supplies the vendor string).
1089	 *
1090	 * WATCHOUT: the Ogg FLAC mapping requires us to write this block after
1091	 * the STREAMINFO.  (In the case that metadata_has_vorbis_comment is
1092	 * true it will have already insured that the metadata list is properly
1093	 * ordered.)
1094	 */
1095	if(!metadata_has_vorbis_comment) {
1096		FLAC__StreamMetadata vorbis_comment;
1097		vorbis_comment.type = FLAC__METADATA_TYPE_VORBIS_COMMENT;
1098		vorbis_comment.is_last = (encoder->protected_->num_metadata_blocks == 0);
1099		vorbis_comment.length = 4 + 4; /* MAGIC NUMBER */
1100		vorbis_comment.data.vorbis_comment.vendor_string.length = 0;
1101		vorbis_comment.data.vorbis_comment.vendor_string.entry = 0;
1102		vorbis_comment.data.vorbis_comment.num_comments = 0;
1103		vorbis_comment.data.vorbis_comment.comments = 0;
1104		if(!FLAC__add_metadata_block(&vorbis_comment, encoder->private_->frame)) {
1105			encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
1106			return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR;
1107		}
1108		if(!write_bitbuffer_(encoder, 0, /*is_last_block=*/false)) {
1109			/* the above function sets the state for us in case of an error */
1110			return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR;
1111		}
1112	}
1113
1114	/*
1115	 * write the user's metadata blocks
1116	 */
1117	for(i = 0; i < encoder->protected_->num_metadata_blocks; i++) {
1118		encoder->protected_->metadata[i]->is_last = (i == encoder->protected_->num_metadata_blocks - 1);
1119		if(!FLAC__add_metadata_block(encoder->protected_->metadata[i], encoder->private_->frame)) {
1120			encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
1121			return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR;
1122		}
1123		if(!write_bitbuffer_(encoder, 0, /*is_last_block=*/false)) {
1124			/* the above function sets the state for us in case of an error */
1125			return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR;
1126		}
1127	}
1128
1129	/* now that all the metadata is written, we save the stream offset */
1130	if(encoder->private_->tell_callback && encoder->private_->tell_callback(encoder, &encoder->protected_->audio_offset, encoder->private_->client_data) == FLAC__STREAM_ENCODER_TELL_STATUS_ERROR) { /* FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED just means we didn't get the offset; no error */
1131		encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR;
1132		return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR;
1133	}
1134
1135	if(encoder->protected_->verify)
1136		encoder->private_->verify.state_hint = ENCODER_IN_AUDIO;
1137
1138	return FLAC__STREAM_ENCODER_INIT_STATUS_OK;
1139}
1140
1141FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_stream(
1142	FLAC__StreamEncoder *encoder,
1143	FLAC__StreamEncoderWriteCallback write_callback,
1144	FLAC__StreamEncoderSeekCallback seek_callback,
1145	FLAC__StreamEncoderTellCallback tell_callback,
1146	FLAC__StreamEncoderMetadataCallback metadata_callback,
1147	void *client_data
1148)
1149{
1150	return init_stream_internal_(
1151		encoder,
1152		/*read_callback=*/0,
1153		write_callback,
1154		seek_callback,
1155		tell_callback,
1156		metadata_callback,
1157		client_data,
1158		/*is_ogg=*/false
1159	);
1160}
1161
1162FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_ogg_stream(
1163	FLAC__StreamEncoder *encoder,
1164	FLAC__StreamEncoderReadCallback read_callback,
1165	FLAC__StreamEncoderWriteCallback write_callback,
1166	FLAC__StreamEncoderSeekCallback seek_callback,
1167	FLAC__StreamEncoderTellCallback tell_callback,
1168	FLAC__StreamEncoderMetadataCallback metadata_callback,
1169	void *client_data
1170)
1171{
1172	return init_stream_internal_(
1173		encoder,
1174		read_callback,
1175		write_callback,
1176		seek_callback,
1177		tell_callback,
1178		metadata_callback,
1179		client_data,
1180		/*is_ogg=*/true
1181	);
1182}
1183
1184static FLAC__StreamEncoderInitStatus init_FILE_internal_(
1185	FLAC__StreamEncoder *encoder,
1186	FILE *file,
1187	FLAC__StreamEncoderProgressCallback progress_callback,
1188	void *client_data,
1189	FLAC__bool is_ogg
1190)
1191{
1192	FLAC__StreamEncoderInitStatus init_status;
1193
1194	FLAC__ASSERT(0 != encoder);
1195	FLAC__ASSERT(0 != file);
1196
1197	if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1198		return FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED;
1199
1200	/* double protection */
1201	if(file == 0) {
1202		encoder->protected_->state = FLAC__STREAM_ENCODER_IO_ERROR;
1203		return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR;
1204	}
1205
1206	/*
1207	 * To make sure that our file does not go unclosed after an error, we
1208	 * must assign the FILE pointer before any further error can occur in
1209	 * this routine.
1210	 */
1211	if(file == stdout)
1212		file = get_binary_stdout_(); /* just to be safe */
1213
1214	encoder->private_->file = file;
1215
1216	encoder->private_->progress_callback = progress_callback;
1217	encoder->private_->bytes_written = 0;
1218	encoder->private_->samples_written = 0;
1219	encoder->private_->frames_written = 0;
1220
1221	init_status = init_stream_internal_(
1222		encoder,
1223		encoder->private_->file == stdout? 0 : is_ogg? file_read_callback_ : 0,
1224		file_write_callback_,
1225		encoder->private_->file == stdout? 0 : file_seek_callback_,
1226		encoder->private_->file == stdout? 0 : file_tell_callback_,
1227		/*metadata_callback=*/0,
1228		client_data,
1229		is_ogg
1230	);
1231	if(init_status != FLAC__STREAM_ENCODER_INIT_STATUS_OK) {
1232		/* the above function sets the state for us in case of an error */
1233		return init_status;
1234	}
1235
1236	{
1237		unsigned blocksize = FLAC__stream_encoder_get_blocksize(encoder);
1238
1239		FLAC__ASSERT(blocksize != 0);
1240		encoder->private_->total_frames_estimate = (unsigned)((FLAC__stream_encoder_get_total_samples_estimate(encoder) + blocksize - 1) / blocksize);
1241	}
1242
1243	return init_status;
1244}
1245
1246FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_FILE(
1247	FLAC__StreamEncoder *encoder,
1248	FILE *file,
1249	FLAC__StreamEncoderProgressCallback progress_callback,
1250	void *client_data
1251)
1252{
1253	return init_FILE_internal_(encoder, file, progress_callback, client_data, /*is_ogg=*/false);
1254}
1255
1256FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_ogg_FILE(
1257	FLAC__StreamEncoder *encoder,
1258	FILE *file,
1259	FLAC__StreamEncoderProgressCallback progress_callback,
1260	void *client_data
1261)
1262{
1263	return init_FILE_internal_(encoder, file, progress_callback, client_data, /*is_ogg=*/true);
1264}
1265
1266static FLAC__StreamEncoderInitStatus init_file_internal_(
1267	FLAC__StreamEncoder *encoder,
1268	const char *filename,
1269	FLAC__StreamEncoderProgressCallback progress_callback,
1270	void *client_data,
1271	FLAC__bool is_ogg
1272)
1273{
1274	FILE *file;
1275
1276	FLAC__ASSERT(0 != encoder);
1277
1278	/*
1279	 * To make sure that our file does not go unclosed after an error, we
1280	 * have to do the same entrance checks here that are later performed
1281	 * in FLAC__stream_encoder_init_FILE() before the FILE* is assigned.
1282	 */
1283	if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1284		return FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED;
1285
1286	file = filename? fopen(filename, "w+b") : stdout;
1287
1288	if(file == 0) {
1289		encoder->protected_->state = FLAC__STREAM_ENCODER_IO_ERROR;
1290		return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR;
1291	}
1292
1293	return init_FILE_internal_(encoder, file, progress_callback, client_data, is_ogg);
1294}
1295
1296FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_file(
1297	FLAC__StreamEncoder *encoder,
1298	const char *filename,
1299	FLAC__StreamEncoderProgressCallback progress_callback,
1300	void *client_data
1301)
1302{
1303	return init_file_internal_(encoder, filename, progress_callback, client_data, /*is_ogg=*/false);
1304}
1305
1306FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_ogg_file(
1307	FLAC__StreamEncoder *encoder,
1308	const char *filename,
1309	FLAC__StreamEncoderProgressCallback progress_callback,
1310	void *client_data
1311)
1312{
1313	return init_file_internal_(encoder, filename, progress_callback, client_data, /*is_ogg=*/true);
1314}
1315
1316FLAC_API FLAC__bool FLAC__stream_encoder_finish(FLAC__StreamEncoder *encoder)
1317{
1318	FLAC__bool error = false;
1319
1320	FLAC__ASSERT(0 != encoder);
1321	FLAC__ASSERT(0 != encoder->private_);
1322	FLAC__ASSERT(0 != encoder->protected_);
1323
1324	if(encoder->protected_->state == FLAC__STREAM_ENCODER_UNINITIALIZED)
1325		return true;
1326
1327	if(encoder->protected_->state == FLAC__STREAM_ENCODER_OK && !encoder->private_->is_being_deleted) {
1328		if(encoder->private_->current_sample_number != 0) {
1329			const FLAC__bool is_fractional_block = encoder->protected_->blocksize != encoder->private_->current_sample_number;
1330			encoder->protected_->blocksize = encoder->private_->current_sample_number;
1331			if(!process_frame_(encoder, is_fractional_block, /*is_last_block=*/true))
1332				error = true;
1333		}
1334	}
1335
1336	if(encoder->protected_->do_md5)
1337		FLAC__MD5Final(encoder->private_->streaminfo.data.stream_info.md5sum, &encoder->private_->md5context);
1338
1339	if(!encoder->private_->is_being_deleted) {
1340		if(encoder->protected_->state == FLAC__STREAM_ENCODER_OK) {
1341			if(encoder->private_->seek_callback) {
1342#if FLAC__HAS_OGG
1343				if(encoder->private_->is_ogg)
1344					update_ogg_metadata_(encoder);
1345				else
1346#endif
1347				update_metadata_(encoder);
1348
1349				/* check if an error occurred while updating metadata */
1350				if(encoder->protected_->state != FLAC__STREAM_ENCODER_OK)
1351					error = true;
1352			}
1353			if(encoder->private_->metadata_callback)
1354				encoder->private_->metadata_callback(encoder, &encoder->private_->streaminfo, encoder->private_->client_data);
1355		}
1356
1357		if(encoder->protected_->verify && 0 != encoder->private_->verify.decoder && !FLAC__stream_decoder_finish(encoder->private_->verify.decoder)) {
1358			if(!error)
1359				encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA;
1360			error = true;
1361		}
1362	}
1363
1364	if(0 != encoder->private_->file) {
1365		if(encoder->private_->file != stdout)
1366			fclose(encoder->private_->file);
1367		encoder->private_->file = 0;
1368	}
1369
1370#if FLAC__HAS_OGG
1371	if(encoder->private_->is_ogg)
1372		FLAC__ogg_encoder_aspect_finish(&encoder->protected_->ogg_encoder_aspect);
1373#endif
1374
1375	free_(encoder);
1376	set_defaults_(encoder);
1377
1378	if(!error)
1379		encoder->protected_->state = FLAC__STREAM_ENCODER_UNINITIALIZED;
1380
1381	return !error;
1382}
1383
1384FLAC_API FLAC__bool FLAC__stream_encoder_set_ogg_serial_number(FLAC__StreamEncoder *encoder, long value)
1385{
1386	FLAC__ASSERT(0 != encoder);
1387	FLAC__ASSERT(0 != encoder->private_);
1388	FLAC__ASSERT(0 != encoder->protected_);
1389	if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1390		return false;
1391#if FLAC__HAS_OGG
1392	/* can't check encoder->private_->is_ogg since that's not set until init time */
1393	FLAC__ogg_encoder_aspect_set_serial_number(&encoder->protected_->ogg_encoder_aspect, value);
1394	return true;
1395#else
1396	(void)value;
1397	return false;
1398#endif
1399}
1400
1401FLAC_API FLAC__bool FLAC__stream_encoder_set_verify(FLAC__StreamEncoder *encoder, FLAC__bool value)
1402{
1403	FLAC__ASSERT(0 != encoder);
1404	FLAC__ASSERT(0 != encoder->private_);
1405	FLAC__ASSERT(0 != encoder->protected_);
1406	if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1407		return false;
1408#ifndef FLAC__MANDATORY_VERIFY_WHILE_ENCODING
1409	encoder->protected_->verify = value;
1410#endif
1411	return true;
1412}
1413
1414FLAC_API FLAC__bool FLAC__stream_encoder_set_streamable_subset(FLAC__StreamEncoder *encoder, FLAC__bool value)
1415{
1416	FLAC__ASSERT(0 != encoder);
1417	FLAC__ASSERT(0 != encoder->private_);
1418	FLAC__ASSERT(0 != encoder->protected_);
1419	if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1420		return false;
1421	encoder->protected_->streamable_subset = value;
1422	return true;
1423}
1424
1425FLAC_API FLAC__bool FLAC__stream_encoder_set_do_md5(FLAC__StreamEncoder *encoder, FLAC__bool value)
1426{
1427	FLAC__ASSERT(0 != encoder);
1428	FLAC__ASSERT(0 != encoder->private_);
1429	FLAC__ASSERT(0 != encoder->protected_);
1430	if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1431		return false;
1432	encoder->protected_->do_md5 = value;
1433	return true;
1434}
1435
1436FLAC_API FLAC__bool FLAC__stream_encoder_set_channels(FLAC__StreamEncoder *encoder, unsigned value)
1437{
1438	FLAC__ASSERT(0 != encoder);
1439	FLAC__ASSERT(0 != encoder->private_);
1440	FLAC__ASSERT(0 != encoder->protected_);
1441	if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1442		return false;
1443	encoder->protected_->channels = value;
1444	return true;
1445}
1446
1447FLAC_API FLAC__bool FLAC__stream_encoder_set_bits_per_sample(FLAC__StreamEncoder *encoder, unsigned value)
1448{
1449	FLAC__ASSERT(0 != encoder);
1450	FLAC__ASSERT(0 != encoder->private_);
1451	FLAC__ASSERT(0 != encoder->protected_);
1452	if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1453		return false;
1454	encoder->protected_->bits_per_sample = value;
1455	return true;
1456}
1457
1458FLAC_API FLAC__bool FLAC__stream_encoder_set_sample_rate(FLAC__StreamEncoder *encoder, unsigned value)
1459{
1460	FLAC__ASSERT(0 != encoder);
1461	FLAC__ASSERT(0 != encoder->private_);
1462	FLAC__ASSERT(0 != encoder->protected_);
1463	if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1464		return false;
1465	encoder->protected_->sample_rate = value;
1466	return true;
1467}
1468
1469FLAC_API FLAC__bool FLAC__stream_encoder_set_compression_level(FLAC__StreamEncoder *encoder, unsigned value)
1470{
1471	FLAC__bool ok = true;
1472	FLAC__ASSERT(0 != encoder);
1473	FLAC__ASSERT(0 != encoder->private_);
1474	FLAC__ASSERT(0 != encoder->protected_);
1475	if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1476		return false;
1477	if(value >= sizeof(compression_levels_)/sizeof(compression_levels_[0]))
1478		value = sizeof(compression_levels_)/sizeof(compression_levels_[0]) - 1;
1479	ok &= FLAC__stream_encoder_set_do_mid_side_stereo          (encoder, compression_levels_[value].do_mid_side_stereo);
1480	ok &= FLAC__stream_encoder_set_loose_mid_side_stereo       (encoder, compression_levels_[value].loose_mid_side_stereo);
1481#ifndef FLAC__INTEGER_ONLY_LIBRARY
1482#if 0
1483	/* was: */
1484	ok &= FLAC__stream_encoder_set_apodization                 (encoder, compression_levels_[value].apodization);
1485	/* but it's too hard to specify the string in a locale-specific way */
1486#else
1487	encoder->protected_->num_apodizations = 1;
1488	encoder->protected_->apodizations[0].type = FLAC__APODIZATION_TUKEY;
1489	encoder->protected_->apodizations[0].parameters.tukey.p = 0.5;
1490#endif
1491#endif
1492	ok &= FLAC__stream_encoder_set_max_lpc_order               (encoder, compression_levels_[value].max_lpc_order);
1493	ok &= FLAC__stream_encoder_set_qlp_coeff_precision         (encoder, compression_levels_[value].qlp_coeff_precision);
1494	ok &= FLAC__stream_encoder_set_do_qlp_coeff_prec_search    (encoder, compression_levels_[value].do_qlp_coeff_prec_search);
1495	ok &= FLAC__stream_encoder_set_do_escape_coding            (encoder, compression_levels_[value].do_escape_coding);
1496	ok &= FLAC__stream_encoder_set_do_exhaustive_model_search  (encoder, compression_levels_[value].do_exhaustive_model_search);
1497	ok &= FLAC__stream_encoder_set_min_residual_partition_order(encoder, compression_levels_[value].min_residual_partition_order);
1498	ok &= FLAC__stream_encoder_set_max_residual_partition_order(encoder, compression_levels_[value].max_residual_partition_order);
1499	ok &= FLAC__stream_encoder_set_rice_parameter_search_dist  (encoder, compression_levels_[value].rice_parameter_search_dist);
1500	return ok;
1501}
1502
1503FLAC_API FLAC__bool FLAC__stream_encoder_set_blocksize(FLAC__StreamEncoder *encoder, unsigned value)
1504{
1505	FLAC__ASSERT(0 != encoder);
1506	FLAC__ASSERT(0 != encoder->private_);
1507	FLAC__ASSERT(0 != encoder->protected_);
1508	if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1509		return false;
1510	encoder->protected_->blocksize = value;
1511	return true;
1512}
1513
1514FLAC_API FLAC__bool FLAC__stream_encoder_set_do_mid_side_stereo(FLAC__StreamEncoder *encoder, FLAC__bool value)
1515{
1516	FLAC__ASSERT(0 != encoder);
1517	FLAC__ASSERT(0 != encoder->private_);
1518	FLAC__ASSERT(0 != encoder->protected_);
1519	if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1520		return false;
1521	encoder->protected_->do_mid_side_stereo = value;
1522	return true;
1523}
1524
1525FLAC_API FLAC__bool FLAC__stream_encoder_set_loose_mid_side_stereo(FLAC__StreamEncoder *encoder, FLAC__bool value)
1526{
1527	FLAC__ASSERT(0 != encoder);
1528	FLAC__ASSERT(0 != encoder->private_);
1529	FLAC__ASSERT(0 != encoder->protected_);
1530	if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1531		return false;
1532	encoder->protected_->loose_mid_side_stereo = value;
1533	return true;
1534}
1535
1536/*@@@@add to tests*/
1537FLAC_API FLAC__bool FLAC__stream_encoder_set_apodization(FLAC__StreamEncoder *encoder, const char *specification)
1538{
1539	FLAC__ASSERT(0 != encoder);
1540	FLAC__ASSERT(0 != encoder->private_);
1541	FLAC__ASSERT(0 != encoder->protected_);
1542	FLAC__ASSERT(0 != specification);
1543	if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1544		return false;
1545#ifdef FLAC__INTEGER_ONLY_LIBRARY
1546	(void)specification; /* silently ignore since we haven't integerized; will always use a rectangular window */
1547#else
1548	encoder->protected_->num_apodizations = 0;
1549	while(1) {
1550		const char *s = strchr(specification, ';');
1551		const size_t n = s? (size_t)(s - specification) : strlen(specification);
1552		if     (n==8  && 0 == strncmp("bartlett"     , specification, n))
1553			encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_BARTLETT;
1554		else if(n==13 && 0 == strncmp("bartlett_hann", specification, n))
1555			encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_BARTLETT_HANN;
1556		else if(n==8  && 0 == strncmp("blackman"     , specification, n))
1557			encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_BLACKMAN;
1558		else if(n==26 && 0 == strncmp("blackman_harris_4term_92db", specification, n))
1559			encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_BLACKMAN_HARRIS_4TERM_92DB_SIDELOBE;
1560		else if(n==6  && 0 == strncmp("connes"       , specification, n))
1561			encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_CONNES;
1562		else if(n==7  && 0 == strncmp("flattop"      , specification, n))
1563			encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_FLATTOP;
1564		else if(n>7   && 0 == strncmp("gauss("       , specification, 6)) {
1565			FLAC__real stddev = (FLAC__real)strtod(specification+6, 0);
1566			if (stddev > 0.0 && stddev <= 0.5) {
1567				encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.gauss.stddev = stddev;
1568				encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_GAUSS;
1569			}
1570		}
1571		else if(n==7  && 0 == strncmp("hamming"      , specification, n))
1572			encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_HAMMING;
1573		else if(n==4  && 0 == strncmp("hann"         , specification, n))
1574			encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_HANN;
1575		else if(n==13 && 0 == strncmp("kaiser_bessel", specification, n))
1576			encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_KAISER_BESSEL;
1577		else if(n==7  && 0 == strncmp("nuttall"      , specification, n))
1578			encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_NUTTALL;
1579		else if(n==9  && 0 == strncmp("rectangle"    , specification, n))
1580			encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_RECTANGLE;
1581		else if(n==8  && 0 == strncmp("triangle"     , specification, n))
1582			encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_TRIANGLE;
1583		else if(n>7   && 0 == strncmp("tukey("       , specification, 6)) {
1584			FLAC__real p = (FLAC__real)strtod(specification+6, 0);
1585			if (p >= 0.0 && p <= 1.0) {
1586				encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.tukey.p = p;
1587				encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_TUKEY;
1588			}
1589		}
1590		else if(n==5  && 0 == strncmp("welch"        , specification, n))
1591			encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_WELCH;
1592		if (encoder->protected_->num_apodizations == 32)
1593			break;
1594		if (s)
1595			specification = s+1;
1596		else
1597			break;
1598	}
1599	if(encoder->protected_->num_apodizations == 0) {
1600		encoder->protected_->num_apodizations = 1;
1601		encoder->protected_->apodizations[0].type = FLAC__APODIZATION_TUKEY;
1602		encoder->protected_->apodizations[0].parameters.tukey.p = 0.5;
1603	}
1604#endif
1605	return true;
1606}
1607
1608FLAC_API FLAC__bool FLAC__stream_encoder_set_max_lpc_order(FLAC__StreamEncoder *encoder, unsigned value)
1609{
1610	FLAC__ASSERT(0 != encoder);
1611	FLAC__ASSERT(0 != encoder->private_);
1612	FLAC__ASSERT(0 != encoder->protected_);
1613	if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1614		return false;
1615	encoder->protected_->max_lpc_order = value;
1616	return true;
1617}
1618
1619FLAC_API FLAC__bool FLAC__stream_encoder_set_qlp_coeff_precision(FLAC__StreamEncoder *encoder, unsigned value)
1620{
1621	FLAC__ASSERT(0 != encoder);
1622	FLAC__ASSERT(0 != encoder->private_);
1623	FLAC__ASSERT(0 != encoder->protected_);
1624	if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1625		return false;
1626	encoder->protected_->qlp_coeff_precision = value;
1627	return true;
1628}
1629
1630FLAC_API FLAC__bool FLAC__stream_encoder_set_do_qlp_coeff_prec_search(FLAC__StreamEncoder *encoder, FLAC__bool value)
1631{
1632	FLAC__ASSERT(0 != encoder);
1633	FLAC__ASSERT(0 != encoder->private_);
1634	FLAC__ASSERT(0 != encoder->protected_);
1635	if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1636		return false;
1637	encoder->protected_->do_qlp_coeff_prec_search = value;
1638	return true;
1639}
1640
1641FLAC_API FLAC__bool FLAC__stream_encoder_set_do_escape_coding(FLAC__StreamEncoder *encoder, FLAC__bool value)
1642{
1643	FLAC__ASSERT(0 != encoder);
1644	FLAC__ASSERT(0 != encoder->private_);
1645	FLAC__ASSERT(0 != encoder->protected_);
1646	if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1647		return false;
1648#if 0
1649	/*@@@ deprecated: */
1650	encoder->protected_->do_escape_coding = value;
1651#else
1652	(void)value;
1653#endif
1654	return true;
1655}
1656
1657FLAC_API FLAC__bool FLAC__stream_encoder_set_do_exhaustive_model_search(FLAC__StreamEncoder *encoder, FLAC__bool value)
1658{
1659	FLAC__ASSERT(0 != encoder);
1660	FLAC__ASSERT(0 != encoder->private_);
1661	FLAC__ASSERT(0 != encoder->protected_);
1662	if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1663		return false;
1664	encoder->protected_->do_exhaustive_model_search = value;
1665	return true;
1666}
1667
1668FLAC_API FLAC__bool FLAC__stream_encoder_set_min_residual_partition_order(FLAC__StreamEncoder *encoder, unsigned value)
1669{
1670	FLAC__ASSERT(0 != encoder);
1671	FLAC__ASSERT(0 != encoder->private_);
1672	FLAC__ASSERT(0 != encoder->protected_);
1673	if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1674		return false;
1675	encoder->protected_->min_residual_partition_order = value;
1676	return true;
1677}
1678
1679FLAC_API FLAC__bool FLAC__stream_encoder_set_max_residual_partition_order(FLAC__StreamEncoder *encoder, unsigned value)
1680{
1681	FLAC__ASSERT(0 != encoder);
1682	FLAC__ASSERT(0 != encoder->private_);
1683	FLAC__ASSERT(0 != encoder->protected_);
1684	if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1685		return false;
1686	encoder->protected_->max_residual_partition_order = value;
1687	return true;
1688}
1689
1690FLAC_API FLAC__bool FLAC__stream_encoder_set_rice_parameter_search_dist(FLAC__StreamEncoder *encoder, unsigned value)
1691{
1692	FLAC__ASSERT(0 != encoder);
1693	FLAC__ASSERT(0 != encoder->private_);
1694	FLAC__ASSERT(0 != encoder->protected_);
1695	if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1696		return false;
1697#if 0
1698	/*@@@ deprecated: */
1699	encoder->protected_->rice_parameter_search_dist = value;
1700#else
1701	(void)value;
1702#endif
1703	return true;
1704}
1705
1706FLAC_API FLAC__bool FLAC__stream_encoder_set_total_samples_estimate(FLAC__StreamEncoder *encoder, FLAC__uint64 value)
1707{
1708	FLAC__ASSERT(0 != encoder);
1709	FLAC__ASSERT(0 != encoder->private_);
1710	FLAC__ASSERT(0 != encoder->protected_);
1711	if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1712		return false;
1713	encoder->protected_->total_samples_estimate = value;
1714	return true;
1715}
1716
1717FLAC_API FLAC__bool FLAC__stream_encoder_set_metadata(FLAC__StreamEncoder *encoder, FLAC__StreamMetadata **metadata, unsigned num_blocks)
1718{
1719	FLAC__ASSERT(0 != encoder);
1720	FLAC__ASSERT(0 != encoder->private_);
1721	FLAC__ASSERT(0 != encoder->protected_);
1722	if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1723		return false;
1724	if(0 == metadata)
1725		num_blocks = 0;
1726	if(0 == num_blocks)
1727		metadata = 0;
1728	/* realloc() does not do exactly what we want so... */
1729	if(encoder->protected_->metadata) {
1730		free(encoder->protected_->metadata);
1731		encoder->protected_->metadata = 0;
1732		encoder->protected_->num_metadata_blocks = 0;
1733	}
1734	if(num_blocks) {
1735		FLAC__StreamMetadata **m;
1736		if(0 == (m = (FLAC__StreamMetadata**)safe_malloc_mul_2op_(sizeof(m[0]), /*times*/num_blocks)))
1737			return false;
1738		memcpy(m, metadata, sizeof(m[0]) * num_blocks);
1739		encoder->protected_->metadata = m;
1740		encoder->protected_->num_metadata_blocks = num_blocks;
1741	}
1742#if FLAC__HAS_OGG
1743	if(!FLAC__ogg_encoder_aspect_set_num_metadata(&encoder->protected_->ogg_encoder_aspect, num_blocks))
1744		return false;
1745#endif
1746	return true;
1747}
1748
1749/*
1750 * These three functions are not static, but not publically exposed in
1751 * include/FLAC/ either.  They are used by the test suite.
1752 */
1753FLAC_API FLAC__bool FLAC__stream_encoder_disable_constant_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value)
1754{
1755	FLAC__ASSERT(0 != encoder);
1756	FLAC__ASSERT(0 != encoder->private_);
1757	FLAC__ASSERT(0 != encoder->protected_);
1758	if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1759		return false;
1760	encoder->private_->disable_constant_subframes = value;
1761	return true;
1762}
1763
1764FLAC_API FLAC__bool FLAC__stream_encoder_disable_fixed_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value)
1765{
1766	FLAC__ASSERT(0 != encoder);
1767	FLAC__ASSERT(0 != encoder->private_);
1768	FLAC__ASSERT(0 != encoder->protected_);
1769	if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1770		return false;
1771	encoder->private_->disable_fixed_subframes = value;
1772	return true;
1773}
1774
1775FLAC_API FLAC__bool FLAC__stream_encoder_disable_verbatim_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value)
1776{
1777	FLAC__ASSERT(0 != encoder);
1778	FLAC__ASSERT(0 != encoder->private_);
1779	FLAC__ASSERT(0 != encoder->protected_);
1780	if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1781		return false;
1782	encoder->private_->disable_verbatim_subframes = value;
1783	return true;
1784}
1785
1786FLAC_API FLAC__StreamEncoderState FLAC__stream_encoder_get_state(const FLAC__StreamEncoder *encoder)
1787{
1788	FLAC__ASSERT(0 != encoder);
1789	FLAC__ASSERT(0 != encoder->private_);
1790	FLAC__ASSERT(0 != encoder->protected_);
1791	return encoder->protected_->state;
1792}
1793
1794FLAC_API FLAC__StreamDecoderState FLAC__stream_encoder_get_verify_decoder_state(const FLAC__StreamEncoder *encoder)
1795{
1796	FLAC__ASSERT(0 != encoder);
1797	FLAC__ASSERT(0 != encoder->private_);
1798	FLAC__ASSERT(0 != encoder->protected_);
1799	if(encoder->protected_->verify)
1800		return FLAC__stream_decoder_get_state(encoder->private_->verify.decoder);
1801	else
1802		return FLAC__STREAM_DECODER_UNINITIALIZED;
1803}
1804
1805FLAC_API const char *FLAC__stream_encoder_get_resolved_state_string(const FLAC__StreamEncoder *encoder)
1806{
1807	FLAC__ASSERT(0 != encoder);
1808	FLAC__ASSERT(0 != encoder->private_);
1809	FLAC__ASSERT(0 != encoder->protected_);
1810	if(encoder->protected_->state != FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR)
1811		return FLAC__StreamEncoderStateString[encoder->protected_->state];
1812	else
1813		return FLAC__stream_decoder_get_resolved_state_string(encoder->private_->verify.decoder);
1814}
1815
1816FLAC_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)
1817{
1818	FLAC__ASSERT(0 != encoder);
1819	FLAC__ASSERT(0 != encoder->private_);
1820	FLAC__ASSERT(0 != encoder->protected_);
1821	if(0 != absolute_sample)
1822		*absolute_sample = encoder->private_->verify.error_stats.absolute_sample;
1823	if(0 != frame_number)
1824		*frame_number = encoder->private_->verify.error_stats.frame_number;
1825	if(0 != channel)
1826		*channel = encoder->private_->verify.error_stats.channel;
1827	if(0 != sample)
1828		*sample = encoder->private_->verify.error_stats.sample;
1829	if(0 != expected)
1830		*expected = encoder->private_->verify.error_stats.expected;
1831	if(0 != got)
1832		*got = encoder->private_->verify.error_stats.got;
1833}
1834
1835FLAC_API FLAC__bool FLAC__stream_encoder_get_verify(const FLAC__StreamEncoder *encoder)
1836{
1837	FLAC__ASSERT(0 != encoder);
1838	FLAC__ASSERT(0 != encoder->private_);
1839	FLAC__ASSERT(0 != encoder->protected_);
1840	return encoder->protected_->verify;
1841}
1842
1843FLAC_API FLAC__bool FLAC__stream_encoder_get_streamable_subset(const FLAC__StreamEncoder *encoder)
1844{
1845	FLAC__ASSERT(0 != encoder);
1846	FLAC__ASSERT(0 != encoder->private_);
1847	FLAC__ASSERT(0 != encoder->protected_);
1848	return encoder->protected_->streamable_subset;
1849}
1850
1851FLAC_API FLAC__bool FLAC__stream_encoder_get_do_md5(const FLAC__StreamEncoder *encoder)
1852{
1853	FLAC__ASSERT(0 != encoder);
1854	FLAC__ASSERT(0 != encoder->private_);
1855	FLAC__ASSERT(0 != encoder->protected_);
1856	return encoder->protected_->do_md5;
1857}
1858
1859FLAC_API unsigned FLAC__stream_encoder_get_channels(const FLAC__StreamEncoder *encoder)
1860{
1861	FLAC__ASSERT(0 != encoder);
1862	FLAC__ASSERT(0 != encoder->private_);
1863	FLAC__ASSERT(0 != encoder->protected_);
1864	return encoder->protected_->channels;
1865}
1866
1867FLAC_API unsigned FLAC__stream_encoder_get_bits_per_sample(const FLAC__StreamEncoder *encoder)
1868{
1869	FLAC__ASSERT(0 != encoder);
1870	FLAC__ASSERT(0 != encoder->private_);
1871	FLAC__ASSERT(0 != encoder->protected_);
1872	return encoder->protected_->bits_per_sample;
1873}
1874
1875FLAC_API unsigned FLAC__stream_encoder_get_sample_rate(const FLAC__StreamEncoder *encoder)
1876{
1877	FLAC__ASSERT(0 != encoder);
1878	FLAC__ASSERT(0 != encoder->private_);
1879	FLAC__ASSERT(0 != encoder->protected_);
1880	return encoder->protected_->sample_rate;
1881}
1882
1883FLAC_API unsigned FLAC__stream_encoder_get_blocksize(const FLAC__StreamEncoder *encoder)
1884{
1885	FLAC__ASSERT(0 != encoder);
1886	FLAC__ASSERT(0 != encoder->private_);
1887	FLAC__ASSERT(0 != encoder->protected_);
1888	return encoder->protected_->blocksize;
1889}
1890
1891FLAC_API FLAC__bool FLAC__stream_encoder_get_do_mid_side_stereo(const FLAC__StreamEncoder *encoder)
1892{
1893	FLAC__ASSERT(0 != encoder);
1894	FLAC__ASSERT(0 != encoder->private_);
1895	FLAC__ASSERT(0 != encoder->protected_);
1896	return encoder->protected_->do_mid_side_stereo;
1897}
1898
1899FLAC_API FLAC__bool FLAC__stream_encoder_get_loose_mid_side_stereo(const FLAC__StreamEncoder *encoder)
1900{
1901	FLAC__ASSERT(0 != encoder);
1902	FLAC__ASSERT(0 != encoder->private_);
1903	FLAC__ASSERT(0 != encoder->protected_);
1904	return encoder->protected_->loose_mid_side_stereo;
1905}
1906
1907FLAC_API unsigned FLAC__stream_encoder_get_max_lpc_order(const FLAC__StreamEncoder *encoder)
1908{
1909	FLAC__ASSERT(0 != encoder);
1910	FLAC__ASSERT(0 != encoder->private_);
1911	FLAC__ASSERT(0 != encoder->protected_);
1912	return encoder->protected_->max_lpc_order;
1913}
1914
1915FLAC_API unsigned FLAC__stream_encoder_get_qlp_coeff_precision(const FLAC__StreamEncoder *encoder)
1916{
1917	FLAC__ASSERT(0 != encoder);
1918	FLAC__ASSERT(0 != encoder->private_);
1919	FLAC__ASSERT(0 != encoder->protected_);
1920	return encoder->protected_->qlp_coeff_precision;
1921}
1922
1923FLAC_API FLAC__bool FLAC__stream_encoder_get_do_qlp_coeff_prec_search(const FLAC__StreamEncoder *encoder)
1924{
1925	FLAC__ASSERT(0 != encoder);
1926	FLAC__ASSERT(0 != encoder->private_);
1927	FLAC__ASSERT(0 != encoder->protected_);
1928	return encoder->protected_->do_qlp_coeff_prec_search;
1929}
1930
1931FLAC_API FLAC__bool FLAC__stream_encoder_get_do_escape_coding(const FLAC__StreamEncoder *encoder)
1932{
1933	FLAC__ASSERT(0 != encoder);
1934	FLAC__ASSERT(0 != encoder->private_);
1935	FLAC__ASSERT(0 != encoder->protected_);
1936	return encoder->protected_->do_escape_coding;
1937}
1938
1939FLAC_API FLAC__bool FLAC__stream_encoder_get_do_exhaustive_model_search(const FLAC__StreamEncoder *encoder)
1940{
1941	FLAC__ASSERT(0 != encoder);
1942	FLAC__ASSERT(0 != encoder->private_);
1943	FLAC__ASSERT(0 != encoder->protected_);
1944	return encoder->protected_->do_exhaustive_model_search;
1945}
1946
1947FLAC_API unsigned FLAC__stream_encoder_get_min_residual_partition_order(const FLAC__StreamEncoder *encoder)
1948{
1949	FLAC__ASSERT(0 != encoder);
1950	FLAC__ASSERT(0 != encoder->private_);
1951	FLAC__ASSERT(0 != encoder->protected_);
1952	return encoder->protected_->min_residual_partition_order;
1953}
1954
1955FLAC_API unsigned FLAC__stream_encoder_get_max_residual_partition_order(const FLAC__StreamEncoder *encoder)
1956{
1957	FLAC__ASSERT(0 != encoder);
1958	FLAC__ASSERT(0 != encoder->private_);
1959	FLAC__ASSERT(0 != encoder->protected_);
1960	return encoder->protected_->max_residual_partition_order;
1961}
1962
1963FLAC_API unsigned FLAC__stream_encoder_get_rice_parameter_search_dist(const FLAC__StreamEncoder *encoder)
1964{
1965	FLAC__ASSERT(0 != encoder);
1966	FLAC__ASSERT(0 != encoder->private_);
1967	FLAC__ASSERT(0 != encoder->protected_);
1968	return encoder->protected_->rice_parameter_search_dist;
1969}
1970
1971FLAC_API FLAC__uint64 FLAC__stream_encoder_get_total_samples_estimate(const FLAC__StreamEncoder *encoder)
1972{
1973	FLAC__ASSERT(0 != encoder);
1974	FLAC__ASSERT(0 != encoder->private_);
1975	FLAC__ASSERT(0 != encoder->protected_);
1976	return encoder->protected_->total_samples_estimate;
1977}
1978
1979FLAC_API FLAC__bool FLAC__stream_encoder_process(FLAC__StreamEncoder *encoder, const FLAC__int32 * const buffer[], unsigned samples)
1980{
1981	unsigned i, j = 0, channel;
1982	const unsigned channels = encoder->protected_->channels, blocksize = encoder->protected_->blocksize;
1983
1984	FLAC__ASSERT(0 != encoder);
1985	FLAC__ASSERT(0 != encoder->private_);
1986	FLAC__ASSERT(0 != encoder->protected_);
1987	FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK);
1988
1989	do {
1990		const unsigned n = min(blocksize+OVERREAD_-encoder->private_->current_sample_number, samples-j);
1991
1992		if(encoder->protected_->verify)
1993			append_to_verify_fifo_(&encoder->private_->verify.input_fifo, buffer, j, channels, n);
1994
1995		for(channel = 0; channel < channels; channel++)
1996			memcpy(&encoder->private_->integer_signal[channel][encoder->private_->current_sample_number], &buffer[channel][j], sizeof(buffer[channel][0]) * n);
1997
1998		if(encoder->protected_->do_mid_side_stereo) {
1999			FLAC__ASSERT(channels == 2);
2000			/* "i <= blocksize" to overread 1 sample; see comment in OVERREAD_ decl */
2001			for(i = encoder->private_->current_sample_number; i <= blocksize && j < samples; i++, j++) {
2002				encoder->private_->integer_signal_mid_side[1][i] = buffer[0][j] - buffer[1][j];
2003				encoder->private_->integer_signal_mid_side[0][i] = (buffer[0][j] + buffer[1][j]) >> 1; /* NOTE: not the same as 'mid = (buffer[0][j] + buffer[1][j]) / 2' ! */
2004			}
2005		}
2006		else
2007			j += n;
2008
2009		encoder->private_->current_sample_number += n;
2010
2011		/* we only process if we have a full block + 1 extra sample; final block is always handled by FLAC__stream_encoder_finish() */
2012		if(encoder->private_->current_sample_number > blocksize) {
2013			FLAC__ASSERT(encoder->private_->current_sample_number == blocksize+OVERREAD_);
2014			FLAC__ASSERT(OVERREAD_ == 1); /* assert we only overread 1 sample which simplifies the rest of the code below */
2015			if(!process_frame_(encoder, /*is_fractional_block=*/false, /*is_last_block=*/false))
2016				return false;
2017			/* move unprocessed overread samples to beginnings of arrays */
2018			for(channel = 0; channel < channels; channel++)
2019				encoder->private_->integer_signal[channel][0] = encoder->private_->integer_signal[channel][blocksize];
2020			if(encoder->protected_->do_mid_side_stereo) {
2021				encoder->private_->integer_signal_mid_side[0][0] = encoder->private_->integer_signal_mid_side[0][blocksize];
2022				encoder->private_->integer_signal_mid_side[1][0] = encoder->private_->integer_signal_mid_side[1][blocksize];
2023			}
2024			encoder->private_->current_sample_number = 1;
2025		}
2026	} while(j < samples);
2027
2028	return true;
2029}
2030
2031FLAC_API FLAC__bool FLAC__stream_encoder_process_interleaved(FLAC__StreamEncoder *encoder, const FLAC__int32 buffer[], unsigned samples)
2032{
2033	unsigned i, j, k, channel;
2034	FLAC__int32 x, mid, side;
2035	const unsigned channels = encoder->protected_->channels, blocksize = encoder->protected_->blocksize;
2036
2037	FLAC__ASSERT(0 != encoder);
2038	FLAC__ASSERT(0 != encoder->private_);
2039	FLAC__ASSERT(0 != encoder->protected_);
2040	FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK);
2041
2042	j = k = 0;
2043	/*
2044	 * we have several flavors of the same basic loop, optimized for
2045	 * different conditions:
2046	 */
2047	if(encoder->protected_->do_mid_side_stereo && channels == 2) {
2048		/*
2049		 * stereo coding: unroll channel loop
2050		 */
2051		do {
2052			if(encoder->protected_->verify)
2053				append_to_verify_fifo_interleaved_(&encoder->private_->verify.input_fifo, buffer, j, channels, min(blocksize+OVERREAD_-encoder->private_->current_sample_number, samples-j));
2054
2055			/* "i <= blocksize" to overread 1 sample; see comment in OVERREAD_ decl */
2056			for(i = encoder->private_->current_sample_number; i <= blocksize && j < samples; i++, j++) {
2057				encoder->private_->integer_signal[0][i] = mid = side = buffer[k++];
2058				x = buffer[k++];
2059				encoder->private_->integer_signal[1][i] = x;
2060				mid += x;
2061				side -= x;
2062				mid >>= 1; /* NOTE: not the same as 'mid = (left + right) / 2' ! */
2063				encoder->private_->integer_signal_mid_side[1][i] = side;
2064				encoder->private_->integer_signal_mid_side[0][i] = mid;
2065			}
2066			encoder->private_->current_sample_number = i;
2067			/* we only process if we have a full block + 1 extra sample; final block is always handled by FLAC__stream_encoder_finish() */
2068			if(i > blocksize) {
2069				if(!process_frame_(encoder, /*is_fractional_block=*/false, /*is_last_block=*/false))
2070					return false;
2071				/* move unprocessed overread samples to beginnings of arrays */
2072				FLAC__ASSERT(i == blocksize+OVERREAD_);
2073				FLAC__ASSERT(OVERREAD_ == 1); /* assert we only overread 1 sample which simplifies the rest of the code below */
2074				encoder->private_->integer_signal[0][0] = encoder->private_->integer_signal[0][blocksize];
2075				encoder->private_->integer_signal[1][0] = encoder->private_->integer_signal[1][blocksize];
2076				encoder->private_->integer_signal_mid_side[0][0] = encoder->private_->integer_signal_mid_side[0][blocksize];
2077				encoder->private_->integer_signal_mid_side[1][0] = encoder->private_->integer_signal_mid_side[1][blocksize];
2078				encoder->private_->current_sample_number = 1;
2079			}
2080		} while(j < samples);
2081	}
2082	else {
2083		/*
2084		 * independent channel coding: buffer each channel in inner loop
2085		 */
2086		do {
2087			if(encoder->protected_->verify)
2088				append_to_verify_fifo_interleaved_(&encoder->private_->verify.input_fifo, buffer, j, channels, min(blocksize+OVERREAD_-encoder->private_->current_sample_number, samples-j));
2089
2090			/* "i <= blocksize" to overread 1 sample; see comment in OVERREAD_ decl */
2091			for(i = encoder->private_->current_sample_number; i <= blocksize && j < samples; i++, j++) {
2092				for(channel = 0; channel < channels; channel++)
2093					encoder->private_->integer_signal[channel][i] = buffer[k++];
2094			}
2095			encoder->private_->current_sample_number = i;
2096			/* we only process if we have a full block + 1 extra sample; final block is always handled by FLAC__stream_encoder_finish() */
2097			if(i > blocksize) {
2098				if(!process_frame_(encoder, /*is_fractional_block=*/false, /*is_last_block=*/false))
2099					return false;
2100				/* move unprocessed overread samples to beginnings of arrays */
2101				FLAC__ASSERT(i == blocksize+OVERREAD_);
2102				FLAC__ASSERT(OVERREAD_ == 1); /* assert we only overread 1 sample which simplifies the rest of the code below */
2103				for(channel = 0; channel < channels; channel++)
2104					encoder->private_->integer_signal[channel][0] = encoder->private_->integer_signal[channel][blocksize];
2105				encoder->private_->current_sample_number = 1;
2106			}
2107		} while(j < samples);
2108	}
2109
2110	return true;
2111}
2112
2113/***********************************************************************
2114 *
2115 * Private class methods
2116 *
2117 ***********************************************************************/
2118
2119void set_defaults_(FLAC__StreamEncoder *encoder)
2120{
2121	FLAC__ASSERT(0 != encoder);
2122
2123#ifdef FLAC__MANDATORY_VERIFY_WHILE_ENCODING
2124	encoder->protected_->verify = true;
2125#else
2126	encoder->protected_->verify = false;
2127#endif
2128	encoder->protected_->streamable_subset = true;
2129	encoder->protected_->do_md5 = true;
2130	encoder->protected_->do_mid_side_stereo = false;
2131	encoder->protected_->loose_mid_side_stereo = false;
2132	encoder->protected_->channels = 2;
2133	encoder->protected_->bits_per_sample = 16;
2134	encoder->protected_->sample_rate = 44100;
2135	encoder->protected_->blocksize = 0;
2136#ifndef FLAC__INTEGER_ONLY_LIBRARY
2137	encoder->protected_->num_apodizations = 1;
2138	encoder->protected_->apodizations[0].type = FLAC__APODIZATION_TUKEY;
2139	encoder->protected_->apodizations[0].parameters.tukey.p = 0.5;
2140#endif
2141	encoder->protected_->max_lpc_order = 0;
2142	encoder->protected_->qlp_coeff_precision = 0;
2143	encoder->protected_->do_qlp_coeff_prec_search = false;
2144	encoder->protected_->do_exhaustive_model_search = false;
2145	encoder->protected_->do_escape_coding = false;
2146	encoder->protected_->min_residual_partition_order = 0;
2147	encoder->protected_->max_residual_partition_order = 0;
2148	encoder->protected_->rice_parameter_search_dist = 0;
2149	encoder->protected_->total_samples_estimate = 0;
2150	encoder->protected_->metadata = 0;
2151	encoder->protected_->num_metadata_blocks = 0;
2152
2153	encoder->private_->seek_table = 0;
2154	encoder->private_->disable_constant_subframes = false;
2155	encoder->private_->disable_fixed_subframes = false;
2156	encoder->private_->disable_verbatim_subframes = false;
2157#if FLAC__HAS_OGG
2158	encoder->private_->is_ogg = false;
2159#endif
2160	encoder->private_->read_callback = 0;
2161	encoder->private_->write_callback = 0;
2162	encoder->private_->seek_callback = 0;
2163	encoder->private_->tell_callback = 0;
2164	encoder->private_->metadata_callback = 0;
2165	encoder->private_->progress_callback = 0;
2166	encoder->private_->client_data = 0;
2167
2168#if FLAC__HAS_OGG
2169	FLAC__ogg_encoder_aspect_set_defaults(&encoder->protected_->ogg_encoder_aspect);
2170#endif
2171}
2172
2173void free_(FLAC__StreamEncoder *encoder)
2174{
2175	unsigned i, channel;
2176
2177	FLAC__ASSERT(0 != encoder);
2178	if(encoder->protected_->metadata) {
2179		free(encoder->protected_->metadata);
2180		encoder->protected_->metadata = 0;
2181		encoder->protected_->num_metadata_blocks = 0;
2182	}
2183	for(i = 0; i < encoder->protected_->channels; i++) {
2184		if(0 != encoder->private_->integer_signal_unaligned[i]) {
2185			free(encoder->private_->integer_signal_unaligned[i]);
2186			encoder->private_->integer_signal_unaligned[i] = 0;
2187		}
2188#ifndef FLAC__INTEGER_ONLY_LIBRARY
2189		if(0 != encoder->private_->real_signal_unaligned[i]) {
2190			free(encoder->private_->real_signal_unaligned[i]);
2191			encoder->private_->real_signal_unaligned[i] = 0;
2192		}
2193#endif
2194	}
2195	for(i = 0; i < 2; i++) {
2196		if(0 != encoder->private_->integer_signal_mid_side_unaligned[i]) {
2197			free(encoder->private_->integer_signal_mid_side_unaligned[i]);
2198			encoder->private_->integer_signal_mid_side_unaligned[i] = 0;
2199		}
2200#ifndef FLAC__INTEGER_ONLY_LIBRARY
2201		if(0 != encoder->private_->real_signal_mid_side_unaligned[i]) {
2202			free(encoder->private_->real_signal_mid_side_unaligned[i]);
2203			encoder->private_->real_signal_mid_side_unaligned[i] = 0;
2204		}
2205#endif
2206	}
2207#ifndef FLAC__INTEGER_ONLY_LIBRARY
2208	for(i = 0; i < encoder->protected_->num_apodizations; i++) {
2209		if(0 != encoder->private_->window_unaligned[i]) {
2210			free(encoder->private_->window_unaligned[i]);
2211			encoder->private_->window_unaligned[i] = 0;
2212		}
2213	}
2214	if(0 != encoder->private_->windowed_signal_unaligned) {
2215		free(encoder->private_->windowed_signal_unaligned);
2216		encoder->private_->windowed_signal_unaligned = 0;
2217	}
2218#endif
2219	for(channel = 0; channel < encoder->protected_->channels; channel++) {
2220		for(i = 0; i < 2; i++) {
2221			if(0 != encoder->private_->residual_workspace_unaligned[channel][i]) {
2222				free(encoder->private_->residual_workspace_unaligned[channel][i]);
2223				encoder->private_->residual_workspace_unaligned[channel][i] = 0;
2224			}
2225		}
2226	}
2227	for(channel = 0; channel < 2; channel++) {
2228		for(i = 0; i < 2; i++) {
2229			if(0 != encoder->private_->residual_workspace_mid_side_unaligned[channel][i]) {
2230				free(encoder->private_->residual_workspace_mid_side_unaligned[channel][i]);
2231				encoder->private_->residual_workspace_mid_side_unaligned[channel][i] = 0;
2232			}
2233		}
2234	}
2235	if(0 != encoder->private_->abs_residual_partition_sums_unaligned) {
2236		free(encoder->private_->abs_residual_partition_sums_unaligned);
2237		encoder->private_->abs_residual_partition_sums_unaligned = 0;
2238	}
2239	if(0 != encoder->private_->raw_bits_per_partition_unaligned) {
2240		free(encoder->private_->raw_bits_per_partition_unaligned);
2241		encoder->private_->raw_bits_per_partition_unaligned = 0;
2242	}
2243	if(encoder->protected_->verify) {
2244		for(i = 0; i < encoder->protected_->channels; i++) {
2245			if(0 != encoder->private_->verify.input_fifo.data[i]) {
2246				free(encoder->private_->verify.input_fifo.data[i]);
2247				encoder->private_->verify.input_fifo.data[i] = 0;
2248			}
2249		}
2250	}
2251	FLAC__bitwriter_free(encoder->private_->frame);
2252}
2253
2254FLAC__bool resize_buffers_(FLAC__StreamEncoder *encoder, unsigned new_blocksize)
2255{
2256	FLAC__bool ok;
2257	unsigned i, channel;
2258
2259	FLAC__ASSERT(new_blocksize > 0);
2260	FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK);
2261	FLAC__ASSERT(encoder->private_->current_sample_number == 0);
2262
2263	/* To avoid excessive malloc'ing, we only grow the buffer; no shrinking. */
2264	if(new_blocksize <= encoder->private_->input_capacity)
2265		return true;
2266
2267	ok = true;
2268
2269	/* WATCHOUT: FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx()
2270	 * requires that the input arrays (in our case the integer signals)
2271	 * have a buffer of up to 3 zeroes in front (at negative indices) for
2272	 * alignment purposes; we use 4 in front to keep the data well-aligned.
2273	 */
2274
2275	for(i = 0; ok && i < encoder->protected_->channels; i++) {
2276		ok = ok && FLAC__memory_alloc_aligned_int32_array(new_blocksize+4+OVERREAD_, &encoder->private_->integer_signal_unaligned[i], &encoder->private_->integer_signal[i]);
2277		memset(encoder->private_->integer_signal[i], 0, sizeof(FLAC__int32)*4);
2278		encoder->private_->integer_signal[i] += 4;
2279#ifndef FLAC__INTEGER_ONLY_LIBRARY
2280#if 0 /* @@@ currently unused */
2281		if(encoder->protected_->max_lpc_order > 0)
2282			ok = ok && FLAC__memory_alloc_aligned_real_array(new_blocksize+OVERREAD_, &encoder->private_->real_signal_unaligned[i], &encoder->private_->real_signal[i]);
2283#endif
2284#endif
2285	}
2286	for(i = 0; ok && i < 2; i++) {
2287		ok = ok && FLAC__memory_alloc_aligned_int32_array(new_blocksize+4+OVERREAD_, &encoder->private_->integer_signal_mid_side_unaligned[i], &encoder->private_->integer_signal_mid_side[i]);
2288		memset(encoder->private_->integer_signal_mid_side[i], 0, sizeof(FLAC__int32)*4);
2289		encoder->private_->integer_signal_mid_side[i] += 4;
2290#ifndef FLAC__INTEGER_ONLY_LIBRARY
2291#if 0 /* @@@ currently unused */
2292		if(encoder->protected_->max_lpc_order > 0)
2293			ok = ok && FLAC__memory_alloc_aligned_real_array(new_blocksize+OVERREAD_, &encoder->private_->real_signal_mid_side_unaligned[i], &encoder->private_->real_signal_mid_side[i]);
2294#endif
2295#endif
2296	}
2297#ifndef FLAC__INTEGER_ONLY_LIBRARY
2298	if(ok && encoder->protected_->max_lpc_order > 0) {
2299		for(i = 0; ok && i < encoder->protected_->num_apodizations; i++)
2300			ok = ok && FLAC__memory_alloc_aligned_real_array(new_blocksize, &encoder->private_->window_unaligned[i], &encoder->private_->window[i]);
2301		ok = ok && FLAC__memory_alloc_aligned_real_array(new_blocksize, &encoder->private_->windowed_signal_unaligned, &encoder->private_->windowed_signal);
2302	}
2303#endif
2304	for(channel = 0; ok && channel < encoder->protected_->channels; channel++) {
2305		for(i = 0; ok && i < 2; i++) {
2306			ok = ok && FLAC__memory_alloc_aligned_int32_array(new_blocksize, &encoder->private_->residual_workspace_unaligned[channel][i], &encoder->private_->residual_workspace[channel][i]);
2307		}
2308	}
2309	for(channel = 0; ok && channel < 2; channel++) {
2310		for(i = 0; ok && i < 2; i++) {
2311			ok = ok && FLAC__memory_alloc_aligned_int32_array(new_blocksize, &encoder->private_->residual_workspace_mid_side_unaligned[channel][i], &encoder->private_->residual_workspace_mid_side[channel][i]);
2312		}
2313	}
2314	/* the *2 is an approximation to the series 1 + 1/2 + 1/4 + ... that sums tree occupies in a flat array */
2315	/*@@@ new_blocksize*2 is too pessimistic, but to fix, we need smarter logic because a smaller new_blocksize can actually increase the # of partitions; would require moving this out into a separate function, then checking its capacity against the need of the current blocksize&min/max_partition_order (and maybe predictor order) */
2316	ok = ok && FLAC__memory_alloc_aligned_uint64_array(new_blocksize * 2, &encoder->private_->abs_residual_partition_sums_unaligned, &encoder->private_->abs_residual_partition_sums);
2317	if(encoder->protected_->do_escape_coding)
2318		ok = ok && FLAC__memory_alloc_aligned_unsigned_array(new_blocksize * 2, &encoder->private_->raw_bits_per_partition_unaligned, &encoder->private_->raw_bits_per_partition);
2319
2320	/* now adjust the windows if the blocksize has changed */
2321#ifndef FLAC__INTEGER_ONLY_LIBRARY
2322	if(ok && new_blocksize != encoder->private_->input_capacity && encoder->protected_->max_lpc_order > 0) {
2323		for(i = 0; ok && i < encoder->protected_->num_apodizations; i++) {
2324			switch(encoder->protected_->apodizations[i].type) {
2325				case FLAC__APODIZATION_BARTLETT:
2326					FLAC__window_bartlett(encoder->private_->window[i], new_blocksize);
2327					break;
2328				case FLAC__APODIZATION_BARTLETT_HANN:
2329					FLAC__window_bartlett_hann(encoder->private_->window[i], new_blocksize);
2330					break;
2331				case FLAC__APODIZATION_BLACKMAN:
2332					FLAC__window_blackman(encoder->private_->window[i], new_blocksize);
2333					break;
2334				case FLAC__APODIZATION_BLACKMAN_HARRIS_4TERM_92DB_SIDELOBE:
2335					FLAC__window_blackman_harris_4term_92db_sidelobe(encoder->private_->window[i], new_blocksize);
2336					break;
2337				case FLAC__APODIZATION_CONNES:
2338					FLAC__window_connes(encoder->private_->window[i], new_blocksize);
2339					break;
2340				case FLAC__APODIZATION_FLATTOP:
2341					FLAC__window_flattop(encoder->private_->window[i], new_blocksize);
2342					break;
2343				case FLAC__APODIZATION_GAUSS:
2344					FLAC__window_gauss(encoder->private_->window[i], new_blocksize, encoder->protected_->apodizations[i].parameters.gauss.stddev);
2345					break;
2346				case FLAC__APODIZATION_HAMMING:
2347					FLAC__window_hamming(encoder->private_->window[i], new_blocksize);
2348					break;
2349				case FLAC__APODIZATION_HANN:
2350					FLAC__window_hann(encoder->private_->window[i], new_blocksize);
2351					break;
2352				case FLAC__APODIZATION_KAISER_BESSEL:
2353					FLAC__window_kaiser_bessel(encoder->private_->window[i], new_blocksize);
2354					break;
2355				case FLAC__APODIZATION_NUTTALL:
2356					FLAC__window_nuttall(encoder->private_->window[i], new_blocksize);
2357					break;
2358				case FLAC__APODIZATION_RECTANGLE:
2359					FLAC__window_rectangle(encoder->private_->window[i], new_blocksize);
2360					break;
2361				case FLAC__APODIZATION_TRIANGLE:
2362					FLAC__window_triangle(encoder->private_->window[i], new_blocksize);
2363					break;
2364				case FLAC__APODIZATION_TUKEY:
2365					FLAC__window_tukey(encoder->private_->window[i], new_blocksize, encoder->protected_->apodizations[i].parameters.tukey.p);
2366					break;
2367				case FLAC__APODIZATION_WELCH:
2368					FLAC__window_welch(encoder->private_->window[i], new_blocksize);
2369					break;
2370				default:
2371					FLAC__ASSERT(0);
2372					/* double protection */
2373					FLAC__window_hann(encoder->private_->window[i], new_blocksize);
2374					break;
2375			}
2376		}
2377	}
2378#endif
2379
2380	if(ok)
2381		encoder->private_->input_capacity = new_blocksize;
2382	else
2383		encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
2384
2385	return ok;
2386}
2387
2388FLAC__bool write_bitbuffer_(FLAC__StreamEncoder *encoder, unsigned samples, FLAC__bool is_last_block)
2389{
2390	const FLAC__byte *buffer;
2391	size_t bytes;
2392
2393	FLAC__ASSERT(FLAC__bitwriter_is_byte_aligned(encoder->private_->frame));
2394
2395	if(!FLAC__bitwriter_get_buffer(encoder->private_->frame, &buffer, &bytes)) {
2396		encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
2397		return false;
2398	}
2399
2400	if(encoder->protected_->verify) {
2401		encoder->private_->verify.output.data = buffer;
2402		encoder->private_->verify.output.bytes = bytes;
2403		if(encoder->private_->verify.state_hint == ENCODER_IN_MAGIC) {
2404			encoder->private_->verify.needs_magic_hack = true;
2405		}
2406		else {
2407			if(!FLAC__stream_decoder_process_single(encoder->private_->verify.decoder)) {
2408				FLAC__bitwriter_release_buffer(encoder->private_->frame);
2409				FLAC__bitwriter_clear(encoder->private_->frame);
2410				if(encoder->protected_->state != FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA)
2411					encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR;
2412				return false;
2413			}
2414		}
2415	}
2416
2417	if(write_frame_(encoder, buffer, bytes, samples, is_last_block) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) {
2418		FLAC__bitwriter_release_buffer(encoder->private_->frame);
2419		FLAC__bitwriter_clear(encoder->private_->frame);
2420		encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR;
2421		return false;
2422	}
2423
2424	FLAC__bitwriter_release_buffer(encoder->private_->frame);
2425	FLAC__bitwriter_clear(encoder->private_->frame);
2426
2427	if(samples > 0) {
2428		encoder->private_->streaminfo.data.stream_info.min_framesize = min(bytes, encoder->private_->streaminfo.data.stream_info.min_framesize);
2429		encoder->private_->streaminfo.data.stream_info.max_framesize = max(bytes, encoder->private_->streaminfo.data.stream_info.max_framesize);
2430	}
2431
2432	return true;
2433}
2434
2435FLAC__StreamEncoderWriteStatus write_frame_(FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, FLAC__bool is_last_block)
2436{
2437	FLAC__StreamEncoderWriteStatus status;
2438	FLAC__uint64 output_position = 0;
2439
2440	/* FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED just means we didn't get the offset; no error */
2441	if(encoder->private_->tell_callback && encoder->private_->tell_callback(encoder, &output_position, encoder->private_->client_data) == FLAC__STREAM_ENCODER_TELL_STATUS_ERROR) {
2442		encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR;
2443		return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR;
2444	}
2445
2446	/*
2447	 * Watch for the STREAMINFO block and first SEEKTABLE block to go by and store their offsets.
2448	 */
2449	if(samples == 0) {
2450		FLAC__MetadataType type = (buffer[0] & 0x7f);
2451		if(type == FLAC__METADATA_TYPE_STREAMINFO)
2452			encoder->protected_->streaminfo_offset = output_position;
2453		else if(type == FLAC__METADATA_TYPE_SEEKTABLE && encoder->protected_->seektable_offset == 0)
2454			encoder->protected_->seektable_offset = output_position;
2455	}
2456
2457	/*
2458	 * Mark the current seek point if hit (if audio_offset == 0 that
2459	 * means we're still writing metadata and haven't hit the first
2460	 * frame yet)
2461	 */
2462	if(0 != encoder->private_->seek_table && encoder->protected_->audio_offset > 0 && encoder->private_->seek_table->num_points > 0) {
2463		const unsigned blocksize = FLAC__stream_encoder_get_blocksize(encoder);
2464		const FLAC__uint64 frame_first_sample = encoder->private_->samples_written;
2465		const FLAC__uint64 frame_last_sample = frame_first_sample + (FLAC__uint64)blocksize - 1;
2466		FLAC__uint64 test_sample;
2467		unsigned i;
2468		for(i = encoder->private_->first_seekpoint_to_check; i < encoder->private_->seek_table->num_points; i++) {
2469			test_sample = encoder->private_->seek_table->points[i].sample_number;
2470			if(test_sample > frame_last_sample) {
2471				break;
2472			}
2473			else if(test_sample >= frame_first_sample) {
2474				encoder->private_->seek_table->points[i].sample_number = frame_first_sample;
2475				encoder->private_->seek_table->points[i].stream_offset = output_position - encoder->protected_->audio_offset;
2476				encoder->private_->seek_table->points[i].frame_samples = blocksize;
2477				encoder->private_->first_seekpoint_to_check++;
2478				/* DO NOT: "break;" and here's why:
2479				 * The seektable template may contain more than one target
2480				 * sample for any given frame; we will keep looping, generating
2481				 * duplicate seekpoints for them, and we'll clean it up later,
2482				 * just before writing the seektable back to the metadata.
2483				 */
2484			}
2485			else {
2486				encoder->private_->first_seekpoint_to_check++;
2487			}
2488		}
2489	}
2490
2491#if FLAC__HAS_OGG
2492	if(encoder->private_->is_ogg) {
2493		status = FLAC__ogg_encoder_aspect_write_callback_wrapper(
2494			&encoder->protected_->ogg_encoder_aspect,
2495			buffer,
2496			bytes,
2497			samples,
2498			encoder->private_->current_frame_number,
2499			is_last_block,
2500			(FLAC__OggEncoderAspectWriteCallbackProxy)encoder->private_->write_callback,
2501			encoder,
2502			encoder->private_->client_data
2503		);
2504	}
2505	else
2506#endif
2507	status = encoder->private_->write_callback(encoder, buffer, bytes, samples, encoder->private_->current_frame_number, encoder->private_->client_data);
2508
2509	if(status == FLAC__STREAM_ENCODER_WRITE_STATUS_OK) {
2510		encoder->private_->bytes_written += bytes;
2511		encoder->private_->samples_written += samples;
2512		/* we keep a high watermark on the number of frames written because
2513		 * when the encoder goes back to write metadata, 'current_frame'
2514		 * will drop back to 0.
2515		 */
2516		encoder->private_->frames_written = max(encoder->private_->frames_written, encoder->private_->current_frame_number+1);
2517	}
2518	else
2519		encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR;
2520
2521	return status;
2522}
2523
2524/* Gets called when the encoding process has finished so that we can update the STREAMINFO and SEEKTABLE blocks.  */
2525void update_metadata_(const FLAC__StreamEncoder *encoder)
2526{
2527	FLAC__byte b[max(6, FLAC__STREAM_METADATA_SEEKPOINT_LENGTH)];
2528	const FLAC__StreamMetadata *metadata = &encoder->private_->streaminfo;
2529	const FLAC__uint64 samples = metadata->data.stream_info.total_samples;
2530	const unsigned min_framesize = metadata->data.stream_info.min_framesize;
2531	const unsigned max_framesize = metadata->data.stream_info.max_framesize;
2532	const unsigned bps = metadata->data.stream_info.bits_per_sample;
2533	FLAC__StreamEncoderSeekStatus seek_status;
2534
2535	FLAC__ASSERT(metadata->type == FLAC__METADATA_TYPE_STREAMINFO);
2536
2537	/* All this is based on intimate knowledge of the stream header
2538	 * layout, but a change to the header format that would break this
2539	 * would also break all streams encoded in the previous format.
2540	 */
2541
2542	/*
2543	 * Write MD5 signature
2544	 */
2545	{
2546		const unsigned md5_offset =
2547			FLAC__STREAM_METADATA_HEADER_LENGTH +
2548			(
2549				FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN +
2550				FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN +
2551				FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN +
2552				FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN +
2553				FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN +
2554				FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN +
2555				FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN +
2556				FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN
2557			) / 8;
2558
2559		if((seek_status = encoder->private_->seek_callback(encoder, encoder->protected_->streaminfo_offset + md5_offset, encoder->private_->client_data)) != FLAC__STREAM_ENCODER_SEEK_STATUS_OK) {
2560			if(seek_status == FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR)
2561				encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR;
2562			return;
2563		}
2564		if(encoder->private_->write_callback(encoder, metadata->data.stream_info.md5sum, 16, 0, 0, encoder->private_->client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) {
2565			encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR;
2566			return;
2567		}
2568	}
2569
2570	/*
2571	 * Write total samples
2572	 */
2573	{
2574		const unsigned total_samples_byte_offset =
2575			FLAC__STREAM_METADATA_HEADER_LENGTH +
2576			(
2577				FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN +
2578				FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN +
2579				FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN +
2580				FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN +
2581				FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN +
2582				FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN +
2583				FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN
2584				- 4
2585			) / 8;
2586
2587		b[0] = ((FLAC__byte)(bps-1) << 4) | (FLAC__byte)((samples >> 32) & 0x0F);
2588		b[1] = (FLAC__byte)((samples >> 24) & 0xFF);
2589		b[2] = (FLAC__byte)((samples >> 16) & 0xFF);
2590		b[3] = (FLAC__byte)((samples >> 8) & 0xFF);
2591		b[4] = (FLAC__byte)(samples & 0xFF);
2592		if((seek_status = encoder->private_->seek_callback(encoder, encoder->protected_->streaminfo_offset + total_samples_byte_offset, encoder->private_->client_data)) != FLAC__STREAM_ENCODER_SEEK_STATUS_OK) {
2593			if(seek_status == FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR)
2594				encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR;
2595			return;
2596		}
2597		if(encoder->private_->write_callback(encoder, b, 5, 0, 0, encoder->private_->client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) {
2598			encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR;
2599			return;
2600		}
2601	}
2602
2603	/*
2604	 * Write min/max framesize
2605	 */
2606	{
2607		const unsigned min_framesize_offset =
2608			FLAC__STREAM_METADATA_HEADER_LENGTH +
2609			(
2610				FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN +
2611				FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN
2612			) / 8;
2613
2614		b[0] = (FLAC__byte)((min_framesize >> 16) & 0xFF);
2615		b[1] = (FLAC__byte)((min_framesize >> 8) & 0xFF);
2616		b[2] = (FLAC__byte)(min_framesize & 0xFF);
2617		b[3] = (FLAC__byte)((max_framesize >> 16) & 0xFF);
2618		b[4] = (FLAC__byte)((max_framesize >> 8) & 0xFF);
2619		b[5] = (FLAC__byte)(max_framesize & 0xFF);
2620		if((seek_status = encoder->private_->seek_callback(encoder, encoder->protected_->streaminfo_offset + min_framesize_offset, encoder->private_->client_data)) != FLAC__STREAM_ENCODER_SEEK_STATUS_OK) {
2621			if(seek_status == FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR)
2622				encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR;
2623			return;
2624		}
2625		if(encoder->private_->write_callback(encoder, b, 6, 0, 0, encoder->private_->client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) {
2626			encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR;
2627			return;
2628		}
2629	}
2630
2631	/*
2632	 * Write seektable
2633	 */
2634	if(0 != encoder->private_->seek_table && encoder->private_->seek_table->num_points > 0 && encoder->protected_->seektable_offset > 0) {
2635		unsigned i;
2636
2637		FLAC__format_seektable_sort(encoder->private_->seek_table);
2638
2639		FLAC__ASSERT(FLAC__format_seektable_is_legal(encoder->private_->seek_table));
2640
2641		if((seek_status = encoder->private_->seek_callback(encoder, encoder->protected_->seektable_offset + FLAC__STREAM_METADATA_HEADER_LENGTH, encoder->private_->client_data)) != FLAC__STREAM_ENCODER_SEEK_STATUS_OK) {
2642			if(seek_status == FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR)
2643				encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR;
2644			return;
2645		}
2646
2647		for(i = 0; i < encoder->private_->seek_table->num_points; i++) {
2648			FLAC__uint64 xx;
2649			unsigned x;
2650			xx = encoder->private_->seek_table->points[i].sample_number;
2651			b[7] = (FLAC__byte)xx; xx >>= 8;
2652			b[6] = (FLAC__byte)xx; xx >>= 8;
2653			b[5] = (FLAC__byte)xx; xx >>= 8;
2654			b[4] = (FLAC__byte)xx; xx >>= 8;
2655			b[3] = (FLAC__byte)xx; xx >>= 8;
2656			b[2] = (FLAC__byte)xx; xx >>= 8;
2657			b[1] = (FLAC__byte)xx; xx >>= 8;
2658			b[0] = (FLAC__byte)xx; xx >>= 8;
2659			xx = encoder->private_->seek_table->points[i].stream_offset;
2660			b[15] = (FLAC__byte)xx; xx >>= 8;
2661			b[14] = (FLAC__byte)xx; xx >>= 8;
2662			b[13] = (FLAC__byte)xx; xx >>= 8;
2663			b[12] = (FLAC__byte)xx; xx >>= 8;
2664			b[11] = (FLAC__byte)xx; xx >>= 8;
2665			b[10] = (FLAC__byte)xx; xx >>= 8;
2666			b[9] = (FLAC__byte)xx; xx >>= 8;
2667			b[8] = (FLAC__byte)xx; xx >>= 8;
2668			x = encoder->private_->seek_table->points[i].frame_samples;
2669			b[17] = (FLAC__byte)x; x >>= 8;
2670			b[16] = (FLAC__byte)x; x >>= 8;
2671			if(encoder->private_->write_callback(encoder, b, 18, 0, 0, encoder->private_->client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) {
2672				encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR;
2673				return;
2674			}
2675		}
2676	}
2677}
2678
2679#if FLAC__HAS_OGG
2680/* Gets called when the encoding process has finished so that we can update the STREAMINFO and SEEKTABLE blocks.  */
2681void update_ogg_metadata_(FLAC__StreamEncoder *encoder)
2682{
2683	/* the # of bytes in the 1st packet that precede the STREAMINFO */
2684	static const unsigned FIRST_OGG_PACKET_STREAMINFO_PREFIX_LENGTH =
2685		FLAC__OGG_MAPPING_PACKET_TYPE_LENGTH +
2686		FLAC__OGG_MAPPING_MAGIC_LENGTH +
2687		FLAC__OGG_MAPPING_VERSION_MAJOR_LENGTH +
2688		FLAC__OGG_MAPPING_VERSION_MINOR_LENGTH +
2689		FLAC__OGG_MAPPING_NUM_HEADERS_LENGTH +
2690		FLAC__STREAM_SYNC_LENGTH
2691	;
2692	FLAC__byte b[max(6, FLAC__STREAM_METADATA_SEEKPOINT_LENGTH)];
2693	const FLAC__StreamMetadata *metadata = &encoder->private_->streaminfo;
2694	const FLAC__uint64 samples = metadata->data.stream_info.total_samples;
2695	const unsigned min_framesize = metadata->data.stream_info.min_framesize;
2696	const unsigned max_framesize = metadata->data.stream_info.max_framesize;
2697	ogg_page page;
2698
2699	FLAC__ASSERT(metadata->type == FLAC__METADATA_TYPE_STREAMINFO);
2700	FLAC__ASSERT(0 != encoder->private_->seek_callback);
2701
2702	/* Pre-check that client supports seeking, since we don't want the
2703	 * ogg_helper code to ever have to deal with this condition.
2704	 */
2705	if(encoder->private_->seek_callback(encoder, 0, encoder->private_->client_data) == FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED)
2706		return;
2707
2708	/* All this is based on intimate knowledge of the stream header
2709	 * layout, but a change to the header format that would break this
2710	 * would also break all streams encoded in the previous format.
2711	 */
2712
2713	/**
2714	 ** Write STREAMINFO stats
2715	 **/
2716	simple_ogg_page__init(&page);
2717	if(!simple_ogg_page__get_at(encoder, encoder->protected_->streaminfo_offset, &page, encoder->private_->seek_callback, encoder->private_->read_callback, encoder->private_->client_data)) {
2718		simple_ogg_page__clear(&page);
2719		return; /* state already set */
2720	}
2721
2722	/*
2723	 * Write MD5 signature
2724	 */
2725	{
2726		const unsigned md5_offset =
2727			FIRST_OGG_PACKET_STREAMINFO_PREFIX_LENGTH +
2728			FLAC__STREAM_METADATA_HEADER_LENGTH +
2729			(
2730				FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN +
2731				FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN +
2732				FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN +
2733				FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN +
2734				FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN +
2735				FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN +
2736				FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN +
2737				FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN
2738			) / 8;
2739
2740		if(md5_offset + 16 > (unsigned)page.body_len) {
2741			encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR;
2742			simple_ogg_page__clear(&page);
2743			return;
2744		}
2745		memcpy(page.body + md5_offset, metadata->data.stream_info.md5sum, 16);
2746	}
2747
2748	/*
2749	 * Write total samples
2750	 */
2751	{
2752		const unsigned total_samples_byte_offset =
2753			FIRST_OGG_PACKET_STREAMINFO_PREFIX_LENGTH +
2754			FLAC__STREAM_METADATA_HEADER_LENGTH +
2755			(
2756				FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN +
2757				FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN +
2758				FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN +
2759				FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN +
2760				FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN +
2761				FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN +
2762				FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN
2763				- 4
2764			) / 8;
2765
2766		if(total_samples_byte_offset + 5 > (unsigned)page.body_len) {
2767			encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR;
2768			simple_ogg_page__clear(&page);
2769			return;
2770		}
2771		b[0] = (FLAC__byte)page.body[total_samples_byte_offset] & 0xF0;
2772		b[0] |= (FLAC__byte)((samples >> 32) & 0x0F);
2773		b[1] = (FLAC__byte)((samples >> 24) & 0xFF);
2774		b[2] = (FLAC__byte)((samples >> 16) & 0xFF);
2775		b[3] = (FLAC__byte)((samples >> 8) & 0xFF);
2776		b[4] = (FLAC__byte)(samples & 0xFF);
2777		memcpy(page.body + total_samples_byte_offset, b, 5);
2778	}
2779
2780	/*
2781	 * Write min/max framesize
2782	 */
2783	{
2784		const unsigned min_framesize_offset =
2785			FIRST_OGG_PACKET_STREAMINFO_PREFIX_LENGTH +
2786			FLAC__STREAM_METADATA_HEADER_LENGTH +
2787			(
2788				FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN +
2789				FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN
2790			) / 8;
2791
2792		if(min_framesize_offset + 6 > (unsigned)page.body_len) {
2793			encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR;
2794			simple_ogg_page__clear(&page);
2795			return;
2796		}
2797		b[0] = (FLAC__byte)((min_framesize >> 16) & 0xFF);
2798		b[1] = (FLAC__byte)((min_framesize >> 8) & 0xFF);
2799		b[2] = (FLAC__byte)(min_framesize & 0xFF);
2800		b[3] = (FLAC__byte)((max_framesize >> 16) & 0xFF);
2801		b[4] = (FLAC__byte)((max_framesize >> 8) & 0xFF);
2802		b[5] = (FLAC__byte)(max_framesize & 0xFF);
2803		memcpy(page.body + min_framesize_offset, b, 6);
2804	}
2805	if(!simple_ogg_page__set_at(encoder, encoder->protected_->streaminfo_offset, &page, encoder->private_->seek_callback, encoder->private_->write_callback, encoder->private_->client_data)) {
2806		simple_ogg_page__clear(&page);
2807		return; /* state already set */
2808	}
2809	simple_ogg_page__clear(&page);
2810
2811	/*
2812	 * Write seektable
2813	 */
2814	if(0 != encoder->private_->seek_table && encoder->private_->seek_table->num_points > 0 && encoder->protected_->seektable_offset > 0) {
2815		unsigned i;
2816		FLAC__byte *p;
2817
2818		FLAC__format_seektable_sort(encoder->private_->seek_table);
2819
2820		FLAC__ASSERT(FLAC__format_seektable_is_legal(encoder->private_->seek_table));
2821
2822		simple_ogg_page__init(&page);
2823		if(!simple_ogg_page__get_at(encoder, encoder->protected_->seektable_offset, &page, encoder->private_->seek_callback, encoder->private_->read_callback, encoder->private_->client_data)) {
2824			simple_ogg_page__clear(&page);
2825			return; /* state already set */
2826		}
2827
2828		if((FLAC__STREAM_METADATA_HEADER_LENGTH + 18*encoder->private_->seek_table->num_points) != (unsigned)page.body_len) {
2829			encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR;
2830			simple_ogg_page__clear(&page);
2831			return;
2832		}
2833
2834		for(i = 0, p = page.body + FLAC__STREAM_METADATA_HEADER_LENGTH; i < encoder->private_->seek_table->num_points; i++, p += 18) {
2835			FLAC__uint64 xx;
2836			unsigned x;
2837			xx = encoder->private_->seek_table->points[i].sample_number;
2838			b[7] = (FLAC__byte)xx; xx >>= 8;
2839			b[6] = (FLAC__byte)xx; xx >>= 8;
2840			b[5] = (FLAC__byte)xx; xx >>= 8;
2841			b[4] = (FLAC__byte)xx; xx >>= 8;
2842			b[3] = (FLAC__byte)xx; xx >>= 8;
2843			b[2] = (FLAC__byte)xx; xx >>= 8;
2844			b[1] = (FLAC__byte)xx; xx >>= 8;
2845			b[0] = (FLAC__byte)xx; xx >>= 8;
2846			xx = encoder->private_->seek_table->points[i].stream_offset;
2847			b[15] = (FLAC__byte)xx; xx >>= 8;
2848			b[14] = (FLAC__byte)xx; xx >>= 8;
2849			b[13] = (FLAC__byte)xx; xx >>= 8;
2850			b[12] = (FLAC__byte)xx; xx >>= 8;
2851			b[11] = (FLAC__byte)xx; xx >>= 8;
2852			b[10] = (FLAC__byte)xx; xx >>= 8;
2853			b[9] = (FLAC__byte)xx; xx >>= 8;
2854			b[8] = (FLAC__byte)xx; xx >>= 8;
2855			x = encoder->private_->seek_table->points[i].frame_samples;
2856			b[17] = (FLAC__byte)x; x >>= 8;
2857			b[16] = (FLAC__byte)x; x >>= 8;
2858			memcpy(p, b, 18);
2859		}
2860
2861		if(!simple_ogg_page__set_at(encoder, encoder->protected_->seektable_offset, &page, encoder->private_->seek_callback, encoder->private_->write_callback, encoder->private_->client_data)) {
2862			simple_ogg_page__clear(&page);
2863			return; /* state already set */
2864		}
2865		simple_ogg_page__clear(&page);
2866	}
2867}
2868#endif
2869
2870FLAC__bool process_frame_(FLAC__StreamEncoder *encoder, FLAC__bool is_fractional_block, FLAC__bool is_last_block)
2871{
2872	FLAC__uint16 crc;
2873	FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK);
2874
2875	/*
2876	 * Accumulate raw signal to the MD5 signature
2877	 */
2878	if(encoder->protected_->do_md5 && !FLAC__MD5Accumulate(&encoder->private_->md5context, (const FLAC__int32 * const *)encoder->private_->integer_signal, encoder->protected_->channels, encoder->protected_->blocksize, (encoder->protected_->bits_per_sample+7) / 8)) {
2879		encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
2880		return false;
2881	}
2882
2883	/*
2884	 * Process the frame header and subframes into the frame bitbuffer
2885	 */
2886	if(!process_subframes_(encoder, is_fractional_block)) {
2887		/* the above function sets the state for us in case of an error */
2888		return false;
2889	}
2890
2891	/*
2892	 * Zero-pad the frame to a byte_boundary
2893	 */
2894	if(!FLAC__bitwriter_zero_pad_to_byte_boundary(encoder->private_->frame)) {
2895		encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
2896		return false;
2897	}
2898
2899	/*
2900	 * CRC-16 the whole thing
2901	 */
2902	FLAC__ASSERT(FLAC__bitwriter_is_byte_aligned(encoder->private_->frame));
2903	if(
2904		!FLAC__bitwriter_get_write_crc16(encoder->private_->frame, &crc) ||
2905		!FLAC__bitwriter_write_raw_uint32(encoder->private_->frame, crc, FLAC__FRAME_FOOTER_CRC_LEN)
2906	) {
2907		encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
2908		return false;
2909	}
2910
2911	/*
2912	 * Write it
2913	 */
2914	if(!write_bitbuffer_(encoder, encoder->protected_->blocksize, is_last_block)) {
2915		/* the above function sets the state for us in case of an error */
2916		return false;
2917	}
2918
2919	/*
2920	 * Get ready for the next frame
2921	 */
2922	encoder->private_->current_sample_number = 0;
2923	encoder->private_->current_frame_number++;
2924	encoder->private_->streaminfo.data.stream_info.total_samples += (FLAC__uint64)encoder->protected_->blocksize;
2925
2926	return true;
2927}
2928
2929FLAC__bool process_subframes_(FLAC__StreamEncoder *encoder, FLAC__bool is_fractional_block)
2930{
2931	FLAC__FrameHeader frame_header;
2932	unsigned channel, min_partition_order = encoder->protected_->min_residual_partition_order, max_partition_order;
2933	FLAC__bool do_independent, do_mid_side;
2934
2935	/*
2936	 * Calculate the min,max Rice partition orders
2937	 */
2938	if(is_fractional_block) {
2939		max_partition_order = 0;
2940	}
2941	else {
2942		max_partition_order = FLAC__format_get_max_rice_partition_order_from_blocksize(encoder->protected_->blocksize);
2943		max_partition_order = min(max_partition_order, encoder->protected_->max_residual_partition_order);
2944	}
2945	min_partition_order = min(min_partition_order, max_partition_order);
2946
2947	/*
2948	 * Setup the frame
2949	 */
2950	frame_header.blocksize = encoder->protected_->blocksize;
2951	frame_header.sample_rate = encoder->protected_->sample_rate;
2952	frame_header.channels = encoder->protected_->channels;
2953	frame_header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT; /* the default unless the encoder determines otherwise */
2954	frame_header.bits_per_sample = encoder->protected_->bits_per_sample;
2955	frame_header.number_type = FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER;
2956	frame_header.number.frame_number = encoder->private_->current_frame_number;
2957
2958	/*
2959	 * Figure out what channel assignments to try
2960	 */
2961	if(encoder->protected_->do_mid_side_stereo) {
2962		if(encoder->protected_->loose_mid_side_stereo) {
2963			if(encoder->private_->loose_mid_side_stereo_frame_count == 0) {
2964				do_independent = true;
2965				do_mid_side = true;
2966			}
2967			else {
2968				do_independent = (encoder->private_->last_channel_assignment == FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT);
2969				do_mid_side = !do_independent;
2970			}
2971		}
2972		else {
2973			do_independent = true;
2974			do_mid_side = true;
2975		}
2976	}
2977	else {
2978		do_independent = true;
2979		do_mid_side = false;
2980	}
2981
2982	FLAC__ASSERT(do_independent || do_mid_side);
2983
2984	/*
2985	 * Check for wasted bits; set effective bps for each subframe
2986	 */
2987	if(do_independent) {
2988		for(channel = 0; channel < encoder->protected_->channels; channel++) {
2989			const unsigned w = get_wasted_bits_(encoder->private_->integer_signal[channel], encoder->protected_->blocksize);
2990			encoder->private_->subframe_workspace[channel][0].wasted_bits = encoder->private_->subframe_workspace[channel][1].wasted_bits = w;
2991			encoder->private_->subframe_bps[channel] = encoder->protected_->bits_per_sample - w;
2992		}
2993	}
2994	if(do_mid_side) {
2995		FLAC__ASSERT(encoder->protected_->channels == 2);
2996		for(channel = 0; channel < 2; channel++) {
2997			const unsigned w = get_wasted_bits_(encoder->private_->integer_signal_mid_side[channel], encoder->protected_->blocksize);
2998			encoder->private_->subframe_workspace_mid_side[channel][0].wasted_bits = encoder->private_->subframe_workspace_mid_side[channel][1].wasted_bits = w;
2999			encoder->private_->subframe_bps_mid_side[channel] = encoder->protected_->bits_per_sample - w + (channel==0? 0:1);
3000		}
3001	}
3002
3003	/*
3004	 * First do a normal encoding pass of each independent channel
3005	 */
3006	if(do_independent) {
3007		for(channel = 0; channel < encoder->protected_->channels; channel++) {
3008			if(!
3009				process_subframe_(
3010					encoder,
3011					min_partition_order,
3012					max_partition_order,
3013					&frame_header,
3014					encoder->private_->subframe_bps[channel],
3015					encoder->private_->integer_signal[channel],
3016					encoder->private_->subframe_workspace_ptr[channel],
3017					encoder->private_->partitioned_rice_contents_workspace_ptr[channel],
3018					encoder->private_->residual_workspace[channel],
3019					encoder->private_->best_subframe+channel,
3020					encoder->private_->best_subframe_bits+channel
3021				)
3022			)
3023				return false;
3024		}
3025	}
3026
3027	/*
3028	 * Now do mid and side channels if requested
3029	 */
3030	if(do_mid_side) {
3031		FLAC__ASSERT(encoder->protected_->channels == 2);
3032
3033		for(channel = 0; channel < 2; channel++) {
3034			if(!
3035				process_subframe_(
3036					encoder,
3037					min_partition_order,
3038					max_partition_order,
3039					&frame_header,
3040					encoder->private_->subframe_bps_mid_side[channel],
3041					encoder->private_->integer_signal_mid_side[channel],
3042					encoder->private_->subframe_workspace_ptr_mid_side[channel],
3043					encoder->private_->partitioned_rice_contents_workspace_ptr_mid_side[channel],
3044					encoder->private_->residual_workspace_mid_side[channel],
3045					encoder->private_->best_subframe_mid_side+channel,
3046					encoder->private_->best_subframe_bits_mid_side+channel
3047				)
3048			)
3049				return false;
3050		}
3051	}
3052
3053	/*
3054	 * Compose the frame bitbuffer
3055	 */
3056	if(do_mid_side) {
3057		unsigned left_bps = 0, right_bps = 0; /* initialized only to prevent superfluous compiler warning */
3058		FLAC__Subframe *left_subframe = 0, *right_subframe = 0; /* initialized only to prevent superfluous compiler warning */
3059		FLAC__ChannelAssignment channel_assignment;
3060
3061		FLAC__ASSERT(encoder->protected_->channels == 2);
3062
3063		if(encoder->protected_->loose_mid_side_stereo && encoder->private_->loose_mid_side_stereo_frame_count > 0) {
3064			channel_assignment = (encoder->private_->last_channel_assignment == FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT? FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT : FLAC__CHANNEL_ASSIGNMENT_MID_SIDE);
3065		}
3066		else {
3067			unsigned bits[4]; /* WATCHOUT - indexed by FLAC__ChannelAssignment */
3068			unsigned min_bits;
3069			int ca;
3070
3071			FLAC__ASSERT(FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT == 0);
3072			FLAC__ASSERT(FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE   == 1);
3073			FLAC__ASSERT(FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE  == 2);
3074			FLAC__ASSERT(FLAC__CHANNEL_ASSIGNMENT_MID_SIDE    == 3);
3075			FLAC__ASSERT(do_independent && do_mid_side);
3076
3077			/* We have to figure out which channel assignent results in the smallest frame */
3078			bits[FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT] = encoder->private_->best_subframe_bits         [0] + encoder->private_->best_subframe_bits         [1];
3079			bits[FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE  ] = encoder->private_->best_subframe_bits         [0] + encoder->private_->best_subframe_bits_mid_side[1];
3080			bits[FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE ] = encoder->private_->best_subframe_bits         [1] + encoder->private_->best_subframe_bits_mid_side[1];
3081			bits[FLAC__CHANNEL_ASSIGNMENT_MID_SIDE   ] = encoder->private_->best_subframe_bits_mid_side[0] + encoder->private_->best_subframe_bits_mid_side[1];
3082
3083			channel_assignment = FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT;
3084			min_bits = bits[channel_assignment];
3085			for(ca = 1; ca <= 3; ca++) {
3086				if(bits[ca] < min_bits) {
3087					min_bits = bits[ca];
3088					channel_assignment = (FLAC__ChannelAssignment)ca;
3089				}
3090			}
3091		}
3092
3093		frame_header.channel_assignment = channel_assignment;
3094
3095		if(!FLAC__frame_add_header(&frame_header, encoder->private_->frame)) {
3096			encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
3097			return false;
3098		}
3099
3100		switch(channel_assignment) {
3101			case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT:
3102				left_subframe  = &encoder->private_->subframe_workspace         [0][encoder->private_->best_subframe         [0]];
3103				right_subframe = &encoder->private_->subframe_workspace         [1][encoder->private_->best_subframe         [1]];
3104				break;
3105			case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE:
3106				left_subframe  = &encoder->private_->subframe_workspace         [0][encoder->private_->best_subframe         [0]];
3107				right_subframe = &encoder->private_->subframe_workspace_mid_side[1][encoder->private_->best_subframe_mid_side[1]];
3108				break;
3109			case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE:
3110				left_subframe  = &encoder->private_->subframe_workspace_mid_side[1][encoder->private_->best_subframe_mid_side[1]];
3111				right_subframe = &encoder->private_->subframe_workspace         [1][encoder->private_->best_subframe         [1]];
3112				break;
3113			case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE:
3114				left_subframe  = &encoder->private_->subframe_workspace_mid_side[0][encoder->private_->best_subframe_mid_side[0]];
3115				right_subframe = &encoder->private_->subframe_workspace_mid_side[1][encoder->private_->best_subframe_mid_side[1]];
3116				break;
3117			default:
3118				FLAC__ASSERT(0);
3119		}
3120
3121		switch(channel_assignment) {
3122			case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT:
3123				left_bps  = encoder->private_->subframe_bps         [0];
3124				right_bps = encoder->private_->subframe_bps         [1];
3125				break;
3126			case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE:
3127				left_bps  = encoder->private_->subframe_bps         [0];
3128				right_bps = encoder->private_->subframe_bps_mid_side[1];
3129				break;
3130			case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE:
3131				left_bps  = encoder->private_->subframe_bps_mid_side[1];
3132				right_bps = encoder->private_->subframe_bps         [1];
3133				break;
3134			case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE:
3135				left_bps  = encoder->private_->subframe_bps_mid_side[0];
3136				right_bps = encoder->private_->subframe_bps_mid_side[1];
3137				break;
3138			default:
3139				FLAC__ASSERT(0);
3140		}
3141
3142		/* note that encoder_add_subframe_ sets the state for us in case of an error */
3143		if(!add_subframe_(encoder, frame_header.blocksize, left_bps , left_subframe , encoder->private_->frame))
3144			return false;
3145		if(!add_subframe_(encoder, frame_header.blocksize, right_bps, right_subframe, encoder->private_->frame))
3146			return false;
3147	}
3148	else {
3149		if(!FLAC__frame_add_header(&frame_header, encoder->private_->frame)) {
3150			encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
3151			return false;
3152		}
3153
3154		for(channel = 0; channel < encoder->protected_->channels; channel++) {
3155			if(!add_subframe_(encoder, frame_header.blocksize, encoder->private_->subframe_bps[channel], &encoder->private_->subframe_workspace[channel][encoder->private_->best_subframe[channel]], encoder->private_->frame)) {
3156				/* the above function sets the state for us in case of an error */
3157				return false;
3158			}
3159		}
3160	}
3161
3162	if(encoder->protected_->loose_mid_side_stereo) {
3163		encoder->private_->loose_mid_side_stereo_frame_count++;
3164		if(encoder->private_->loose_mid_side_stereo_frame_count >= encoder->private_->loose_mid_side_stereo_frames)
3165			encoder->private_->loose_mid_side_stereo_frame_count = 0;
3166	}
3167
3168	encoder->private_->last_channel_assignment = frame_header.channel_assignment;
3169
3170	return true;
3171}
3172
3173FLAC__bool process_subframe_(
3174	FLAC__StreamEncoder *encoder,
3175	unsigned min_partition_order,
3176	unsigned max_partition_order,
3177	const FLAC__FrameHeader *frame_header,
3178	unsigned subframe_bps,
3179	const FLAC__int32 integer_signal[],
3180	FLAC__Subframe *subframe[2],
3181	FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents[2],
3182	FLAC__int32 *residual[2],
3183	unsigned *best_subframe,
3184	unsigned *best_bits
3185)
3186{
3187#ifndef FLAC__INTEGER_ONLY_LIBRARY
3188	FLAC__float fixed_residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1];
3189#else
3190	FLAC__fixedpoint fixed_residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1];
3191#endif
3192#ifndef FLAC__INTEGER_ONLY_LIBRARY
3193	FLAC__double lpc_residual_bits_per_sample;
3194	FLAC__real autoc[FLAC__MAX_LPC_ORDER+1]; /* WATCHOUT: the size is important even though encoder->protected_->max_lpc_order might be less; some asm routines need all the space */
3195	FLAC__double lpc_error[FLAC__MAX_LPC_ORDER];
3196	unsigned min_lpc_order, max_lpc_order, lpc_order;
3197	unsigned min_qlp_coeff_precision, max_qlp_coeff_precision, qlp_coeff_precision;
3198#endif
3199	unsigned min_fixed_order, max_fixed_order, guess_fixed_order, fixed_order;
3200	unsigned rice_parameter;
3201	unsigned _candidate_bits, _best_bits;
3202	unsigned _best_subframe;
3203	/* only use RICE2 partitions if stream bps > 16 */
3204	const unsigned rice_parameter_limit = FLAC__stream_encoder_get_bits_per_sample(encoder) > 16? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER;
3205
3206	FLAC__ASSERT(frame_header->blocksize > 0);
3207
3208	/* verbatim subframe is the baseline against which we measure other compressed subframes */
3209	_best_subframe = 0;
3210	if(encoder->private_->disable_verbatim_subframes && frame_header->blocksize >= FLAC__MAX_FIXED_ORDER)
3211		_best_bits = UINT_MAX;
3212	else
3213		_best_bits = evaluate_verbatim_subframe_(encoder, integer_signal, frame_header->blocksize, subframe_bps, subframe[_best_subframe]);
3214
3215	if(frame_header->blocksize >= FLAC__MAX_FIXED_ORDER) {
3216		unsigned signal_is_constant = false;
3217		guess_fixed_order = encoder->private_->local_fixed_compute_best_predictor(integer_signal+FLAC__MAX_FIXED_ORDER, frame_header->blocksize-FLAC__MAX_FIXED_ORDER, fixed_residual_bits_per_sample);
3218		/* check for constant subframe */
3219		if(
3220			!encoder->private_->disable_constant_subframes &&
3221#ifndef FLAC__INTEGER_ONLY_LIBRARY
3222			fixed_residual_bits_per_sample[1] == 0.0
3223#else
3224			fixed_residual_bits_per_sample[1] == FLAC__FP_ZERO
3225#endif
3226		) {
3227			/* the above means it's possible all samples are the same value; now double-check it: */
3228			unsigned i;
3229			signal_is_constant = true;
3230			for(i = 1; i < frame_header->blocksize; i++) {
3231				if(integer_signal[0] != integer_signal[i]) {
3232					signal_is_constant = false;
3233					break;
3234				}
3235			}
3236		}
3237		if(signal_is_constant) {
3238			_candidate_bits = evaluate_constant_subframe_(encoder, integer_signal[0], frame_header->blocksize, subframe_bps, subframe[!_best_subframe]);
3239			if(_candidate_bits < _best_bits) {
3240				_best_subframe = !_best_subframe;
3241				_best_bits = _candidate_bits;
3242			}
3243		}
3244		else {
3245			if(!encoder->private_->disable_fixed_subframes || (encoder->protected_->max_lpc_order == 0 && _best_bits == UINT_MAX)) {
3246				/* encode fixed */
3247				if(encoder->protected_->do_exhaustive_model_search) {
3248					min_fixed_order = 0;
3249					max_fixed_order = FLAC__MAX_FIXED_ORDER;
3250				}
3251				else {
3252					min_fixed_order = max_fixed_order = guess_fixed_order;
3253				}
3254				if(max_fixed_order >= frame_header->blocksize)
3255					max_fixed_order = frame_header->blocksize - 1;
3256				for(fixed_order = min_fixed_order; fixed_order <= max_fixed_order; fixed_order++) {
3257#ifndef FLAC__INTEGER_ONLY_LIBRARY
3258					if(fixed_residual_bits_per_sample[fixed_order] >= (FLAC__float)subframe_bps)
3259						continue; /* don't even try */
3260					rice_parameter = (fixed_residual_bits_per_sample[fixed_order] > 0.0)? (unsigned)(fixed_residual_bits_per_sample[fixed_order]+0.5) : 0; /* 0.5 is for rounding */
3261#else
3262					if(FLAC__fixedpoint_trunc(fixed_residual_bits_per_sample[fixed_order]) >= (int)subframe_bps)
3263						continue; /* don't even try */
3264					rice_parameter = (fixed_residual_bits_per_sample[fixed_order] > FLAC__FP_ZERO)? (unsigned)FLAC__fixedpoint_trunc(fixed_residual_bits_per_sample[fixed_order]+FLAC__FP_ONE_HALF) : 0; /* 0.5 is for rounding */
3265#endif
3266					rice_parameter++; /* to account for the signed->unsigned conversion during rice coding */
3267					if(rice_parameter >= rice_parameter_limit) {
3268#ifdef DEBUG_VERBOSE
3269						fprintf(stderr, "clipping rice_parameter (%u -> %u) @0\n", rice_parameter, rice_parameter_limit - 1);
3270#endif
3271						rice_parameter = rice_parameter_limit - 1;
3272					}
3273					_candidate_bits =
3274						evaluate_fixed_subframe_(
3275							encoder,
3276							integer_signal,
3277							residual[!_best_subframe],
3278							encoder->private_->abs_residual_partition_sums,
3279							encoder->private_->raw_bits_per_partition,
3280							frame_header->blocksize,
3281							subframe_bps,
3282							fixed_order,
3283							rice_parameter,
3284							rice_parameter_limit,
3285							min_partition_order,
3286							max_partition_order,
3287							encoder->protected_->do_escape_coding,
3288							encoder->protected_->rice_parameter_search_dist,
3289							subframe[!_best_subframe],
3290							partitioned_rice_contents[!_best_subframe]
3291						);
3292					if(_candidate_bits < _best_bits) {
3293						_best_subframe = !_best_subframe;
3294						_best_bits = _candidate_bits;
3295					}
3296				}
3297			}
3298
3299#ifndef FLAC__INTEGER_ONLY_LIBRARY
3300			/* encode lpc */
3301			if(encoder->protected_->max_lpc_order > 0) {
3302				if(encoder->protected_->max_lpc_order >= frame_header->blocksize)
3303					max_lpc_order = frame_header->blocksize-1;
3304				else
3305					max_lpc_order = encoder->protected_->max_lpc_order;
3306				if(max_lpc_order > 0) {
3307					unsigned a;
3308					for (a = 0; a < encoder->protected_->num_apodizations; a++) {
3309						FLAC__lpc_window_data(integer_signal, encoder->private_->window[a], encoder->private_->windowed_signal, frame_header->blocksize);
3310						encoder->private_->local_lpc_compute_autocorrelation(encoder->private_->windowed_signal, frame_header->blocksize, max_lpc_order+1, autoc);
3311						/* if autoc[0] == 0.0, the signal is constant and we usually won't get here, but it can happen */
3312						if(autoc[0] != 0.0) {
3313							FLAC__lpc_compute_lp_coefficients(autoc, &max_lpc_order, encoder->private_->lp_coeff, lpc_error);
3314							if(encoder->protected_->do_exhaustive_model_search) {
3315								min_lpc_order = 1;
3316							}
3317							else {
3318								const unsigned guess_lpc_order =
3319									FLAC__lpc_compute_best_order(
3320										lpc_error,
3321										max_lpc_order,
3322										frame_header->blocksize,
3323										subframe_bps + (
3324											encoder->protected_->do_qlp_coeff_prec_search?
3325												FLAC__MIN_QLP_COEFF_PRECISION : /* have to guess; use the min possible size to avoid accidentally favoring lower orders */
3326												encoder->protected_->qlp_coeff_precision
3327										)
3328									);
3329								min_lpc_order = max_lpc_order = guess_lpc_order;
3330							}
3331							if(max_lpc_order >= frame_header->blocksize)
3332								max_lpc_order = frame_header->blocksize - 1;
3333							for(lpc_order = min_lpc_order; lpc_order <= max_lpc_order; lpc_order++) {
3334								lpc_residual_bits_per_sample = FLAC__lpc_compute_expected_bits_per_residual_sample(lpc_error[lpc_order-1], frame_header->blocksize-lpc_order);
3335								if(lpc_residual_bits_per_sample >= (FLAC__double)subframe_bps)
3336									continue; /* don't even try */
3337								rice_parameter = (lpc_residual_bits_per_sample > 0.0)? (unsigned)(lpc_residual_bits_per_sample+0.5) : 0; /* 0.5 is for rounding */
3338								rice_parameter++; /* to account for the signed->unsigned conversion during rice coding */
3339								if(rice_parameter >= rice_parameter_limit) {
3340#ifdef DEBUG_VERBOSE
3341									fprintf(stderr, "clipping rice_parameter (%u -> %u) @1\n", rice_parameter, rice_parameter_limit - 1);
3342#endif
3343									rice_parameter = rice_parameter_limit - 1;
3344								}
3345								if(encoder->protected_->do_qlp_coeff_prec_search) {
3346									min_qlp_coeff_precision = FLAC__MIN_QLP_COEFF_PRECISION;
3347									/* try to ensure a 32-bit datapath throughout for 16bps(+1bps for side channel) or less */
3348									if(subframe_bps <= 17) {
3349										max_qlp_coeff_precision = min(32 - subframe_bps - lpc_order, FLAC__MAX_QLP_COEFF_PRECISION);
3350										max_qlp_coeff_precision = max(max_qlp_coeff_precision, min_qlp_coeff_precision);
3351									}
3352									else
3353										max_qlp_coeff_precision = FLAC__MAX_QLP_COEFF_PRECISION;
3354								}
3355								else {
3356									min_qlp_coeff_precision = max_qlp_coeff_precision = encoder->protected_->qlp_coeff_precision;
3357								}
3358								for(qlp_coeff_precision = min_qlp_coeff_precision; qlp_coeff_precision <= max_qlp_coeff_precision; qlp_coeff_precision++) {
3359									_candidate_bits =
3360										evaluate_lpc_subframe_(
3361											encoder,
3362											integer_signal,
3363											residual[!_best_subframe],
3364											encoder->private_->abs_residual_partition_sums,
3365											encoder->private_->raw_bits_per_partition,
3366											encoder->private_->lp_coeff[lpc_order-1],
3367											frame_header->blocksize,
3368											subframe_bps,
3369											lpc_order,
3370											qlp_coeff_precision,
3371											rice_parameter,
3372											rice_parameter_limit,
3373											min_partition_order,
3374											max_partition_order,
3375											encoder->protected_->do_escape_coding,
3376											encoder->protected_->rice_parameter_search_dist,
3377											subframe[!_best_subframe],
3378											partitioned_rice_contents[!_best_subframe]
3379										);
3380									if(_candidate_bits > 0) { /* if == 0, there was a problem quantizing the lpcoeffs */
3381										if(_candidate_bits < _best_bits) {
3382											_best_subframe = !_best_subframe;
3383											_best_bits = _candidate_bits;
3384										}
3385									}
3386								}
3387							}
3388						}
3389					}
3390				}
3391			}
3392#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */
3393		}
3394	}
3395
3396	/* under rare circumstances this can happen when all but lpc subframe types are disabled: */
3397	if(_best_bits == UINT_MAX) {
3398		FLAC__ASSERT(_best_subframe == 0);
3399		_best_bits = evaluate_verbatim_subframe_(encoder, integer_signal, frame_header->blocksize, subframe_bps, subframe[_best_subframe]);
3400	}
3401
3402	*best_subframe = _best_subframe;
3403	*best_bits = _best_bits;
3404
3405	return true;
3406}
3407
3408FLAC__bool add_subframe_(
3409	FLAC__StreamEncoder *encoder,
3410	unsigned blocksize,
3411	unsigned subframe_bps,
3412	const FLAC__Subframe *subframe,
3413	FLAC__BitWriter *frame
3414)
3415{
3416	switch(subframe->type) {
3417		case FLAC__SUBFRAME_TYPE_CONSTANT:
3418			if(!FLAC__subframe_add_constant(&(subframe->data.constant), subframe_bps, subframe->wasted_bits, frame)) {
3419				encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
3420				return false;
3421			}
3422			break;
3423		case FLAC__SUBFRAME_TYPE_FIXED:
3424			if(!FLAC__subframe_add_fixed(&(subframe->data.fixed), blocksize - subframe->data.fixed.order, subframe_bps, subframe->wasted_bits, frame)) {
3425				encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
3426				return false;
3427			}
3428			break;
3429		case FLAC__SUBFRAME_TYPE_LPC:
3430			if(!FLAC__subframe_add_lpc(&(subframe->data.lpc), blocksize - subframe->data.lpc.order, subframe_bps, subframe->wasted_bits, frame)) {
3431				encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
3432				return false;
3433			}
3434			break;
3435		case FLAC__SUBFRAME_TYPE_VERBATIM:
3436			if(!FLAC__subframe_add_verbatim(&(subframe->data.verbatim), blocksize, subframe_bps, subframe->wasted_bits, frame)) {
3437				encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
3438				return false;
3439			}
3440			break;
3441		default:
3442			FLAC__ASSERT(0);
3443	}
3444
3445	return true;
3446}
3447
3448#define SPOTCHECK_ESTIMATE 0
3449#if SPOTCHECK_ESTIMATE
3450static void spotcheck_subframe_estimate_(
3451	FLAC__StreamEncoder *encoder,
3452	unsigned blocksize,
3453	unsigned subframe_bps,
3454	const FLAC__Subframe *subframe,
3455	unsigned estimate
3456)
3457{
3458	FLAC__bool ret;
3459	FLAC__BitWriter *frame = FLAC__bitwriter_new();
3460	if(frame == 0) {
3461		fprintf(stderr, "EST: can't allocate frame\n");
3462		return;
3463	}
3464	if(!FLAC__bitwriter_init(frame)) {
3465		fprintf(stderr, "EST: can't init frame\n");
3466		return;
3467	}
3468	ret = add_subframe_(encoder, blocksize, subframe_bps, subframe, frame);
3469	FLAC__ASSERT(ret);
3470	{
3471		const unsigned actual = FLAC__bitwriter_get_input_bits_unconsumed(frame);
3472		if(estimate != actual)
3473			fprintf(stderr, "EST: bad, frame#%u sub#%%d type=%8s est=%u, actual=%u, delta=%d\n", encoder->private_->current_frame_number, FLAC__SubframeTypeString[subframe->type], estimate, actual, (int)actual-(int)estimate);
3474	}
3475	FLAC__bitwriter_delete(frame);
3476}
3477#endif
3478
3479unsigned evaluate_constant_subframe_(
3480	FLAC__StreamEncoder *encoder,
3481	const FLAC__int32 signal,
3482	unsigned blocksize,
3483	unsigned subframe_bps,
3484	FLAC__Subframe *subframe
3485)
3486{
3487	unsigned estimate;
3488	subframe->type = FLAC__SUBFRAME_TYPE_CONSTANT;
3489	subframe->data.constant.value = signal;
3490
3491	estimate = FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + subframe->wasted_bits + subframe_bps;
3492
3493#if SPOTCHECK_ESTIMATE
3494	spotcheck_subframe_estimate_(encoder, blocksize, subframe_bps, subframe, estimate);
3495#else
3496	(void)encoder, (void)blocksize;
3497#endif
3498
3499	return estimate;
3500}
3501
3502unsigned evaluate_fixed_subframe_(
3503	FLAC__StreamEncoder *encoder,
3504	const FLAC__int32 signal[],
3505	FLAC__int32 residual[],
3506	FLAC__uint64 abs_residual_partition_sums[],
3507	unsigned raw_bits_per_partition[],
3508	unsigned blocksize,
3509	unsigned subframe_bps,
3510	unsigned order,
3511	unsigned rice_parameter,
3512	unsigned rice_parameter_limit,
3513	unsigned min_partition_order,
3514	unsigned max_partition_order,
3515	FLAC__bool do_escape_coding,
3516	unsigned rice_parameter_search_dist,
3517	FLAC__Subframe *subframe,
3518	FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents
3519)
3520{
3521	unsigned i, residual_bits, estimate;
3522	const unsigned residual_samples = blocksize - order;
3523
3524	FLAC__fixed_compute_residual(signal+order, residual_samples, order, residual);
3525
3526	subframe->type = FLAC__SUBFRAME_TYPE_FIXED;
3527
3528	subframe->data.fixed.entropy_coding_method.type = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE;
3529	subframe->data.fixed.entropy_coding_method.data.partitioned_rice.contents = partitioned_rice_contents;
3530	subframe->data.fixed.residual = residual;
3531
3532	residual_bits =
3533		find_best_partition_order_(
3534			encoder->private_,
3535			residual,
3536			abs_residual_partition_sums,
3537			raw_bits_per_partition,
3538			residual_samples,
3539			order,
3540			rice_parameter,
3541			rice_parameter_limit,
3542			min_partition_order,
3543			max_partition_order,
3544			subframe_bps,
3545			do_escape_coding,
3546			rice_parameter_search_dist,
3547			&subframe->data.fixed.entropy_coding_method
3548		);
3549
3550	subframe->data.fixed.order = order;
3551	for(i = 0; i < order; i++)
3552		subframe->data.fixed.warmup[i] = signal[i];
3553
3554	estimate = FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + subframe->wasted_bits + (order * subframe_bps) + residual_bits;
3555
3556#if SPOTCHECK_ESTIMATE
3557	spotcheck_subframe_estimate_(encoder, blocksize, subframe_bps, subframe, estimate);
3558#endif
3559
3560	return estimate;
3561}
3562
3563#ifndef FLAC__INTEGER_ONLY_LIBRARY
3564unsigned evaluate_lpc_subframe_(
3565	FLAC__StreamEncoder *encoder,
3566	const FLAC__int32 signal[],
3567	FLAC__int32 residual[],
3568	FLAC__uint64 abs_residual_partition_sums[],
3569	unsigned raw_bits_per_partition[],
3570	const FLAC__real lp_coeff[],
3571	unsigned blocksize,
3572	unsigned subframe_bps,
3573	unsigned order,
3574	unsigned qlp_coeff_precision,
3575	unsigned rice_parameter,
3576	unsigned rice_parameter_limit,
3577	unsigned min_partition_order,
3578	unsigned max_partition_order,
3579	FLAC__bool do_escape_coding,
3580	unsigned rice_parameter_search_dist,
3581	FLAC__Subframe *subframe,
3582	FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents
3583)
3584{
3585	FLAC__int32 qlp_coeff[FLAC__MAX_LPC_ORDER];
3586	unsigned i, residual_bits, estimate;
3587	int quantization, ret;
3588	const unsigned residual_samples = blocksize - order;
3589
3590	/* try to keep qlp coeff precision such that only 32-bit math is required for decode of <=16bps streams */
3591	if(subframe_bps <= 16) {
3592		FLAC__ASSERT(order > 0);
3593		FLAC__ASSERT(order <= FLAC__MAX_LPC_ORDER);
3594		qlp_coeff_precision = min(qlp_coeff_precision, 32 - subframe_bps - FLAC__bitmath_ilog2(order));
3595	}
3596
3597	ret = FLAC__lpc_quantize_coefficients(lp_coeff, order, qlp_coeff_precision, qlp_coeff, &quantization);
3598	if(ret != 0)
3599		return 0; /* this is a hack to indicate to the caller that we can't do lp at this order on this subframe */
3600
3601	if(subframe_bps + qlp_coeff_precision + FLAC__bitmath_ilog2(order) <= 32)
3602		if(subframe_bps <= 16 && qlp_coeff_precision <= 16)
3603			encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit(signal+order, residual_samples, qlp_coeff, order, quantization, residual);
3604		else
3605			encoder->private_->local_lpc_compute_residual_from_qlp_coefficients(signal+order, residual_samples, qlp_coeff, order, quantization, residual);
3606	else
3607		encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit(signal+order, residual_samples, qlp_coeff, order, quantization, residual);
3608
3609	subframe->type = FLAC__SUBFRAME_TYPE_LPC;
3610
3611	subframe->data.lpc.entropy_coding_method.type = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE;
3612	subframe->data.lpc.entropy_coding_method.data.partitioned_rice.contents = partitioned_rice_contents;
3613	subframe->data.lpc.residual = residual;
3614
3615	residual_bits =
3616		find_best_partition_order_(
3617			encoder->private_,
3618			residual,
3619			abs_residual_partition_sums,
3620			raw_bits_per_partition,
3621			residual_samples,
3622			order,
3623			rice_parameter,
3624			rice_parameter_limit,
3625			min_partition_order,
3626			max_partition_order,
3627			subframe_bps,
3628			do_escape_coding,
3629			rice_parameter_search_dist,
3630			&subframe->data.lpc.entropy_coding_method
3631		);
3632
3633	subframe->data.lpc.order = order;
3634	subframe->data.lpc.qlp_coeff_precision = qlp_coeff_precision;
3635	subframe->data.lpc.quantization_level = quantization;
3636	memcpy(subframe->data.lpc.qlp_coeff, qlp_coeff, sizeof(FLAC__int32)*FLAC__MAX_LPC_ORDER);
3637	for(i = 0; i < order; i++)
3638		subframe->data.lpc.warmup[i] = signal[i];
3639
3640	estimate = FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + subframe->wasted_bits + FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN + FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN + (order * (qlp_coeff_precision + subframe_bps)) + residual_bits;
3641
3642#if SPOTCHECK_ESTIMATE
3643	spotcheck_subframe_estimate_(encoder, blocksize, subframe_bps, subframe, estimate);
3644#endif
3645
3646	return estimate;
3647}
3648#endif
3649
3650unsigned evaluate_verbatim_subframe_(
3651	FLAC__StreamEncoder *encoder,
3652	const FLAC__int32 signal[],
3653	unsigned blocksize,
3654	unsigned subframe_bps,
3655	FLAC__Subframe *subframe
3656)
3657{
3658	unsigned estimate;
3659
3660	subframe->type = FLAC__SUBFRAME_TYPE_VERBATIM;
3661
3662	subframe->data.verbatim.data = signal;
3663
3664	estimate = FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + subframe->wasted_bits + (blocksize * subframe_bps);
3665
3666#if SPOTCHECK_ESTIMATE
3667	spotcheck_subframe_estimate_(encoder, blocksize, subframe_bps, subframe, estimate);
3668#else
3669	(void)encoder;
3670#endif
3671
3672	return estimate;
3673}
3674
3675unsigned find_best_partition_order_(
3676	FLAC__StreamEncoderPrivate *private_,
3677	const FLAC__int32 residual[],
3678	FLAC__uint64 abs_residual_partition_sums[],
3679	unsigned raw_bits_per_partition[],
3680	unsigned residual_samples,
3681	unsigned predictor_order,
3682	unsigned rice_parameter,
3683	unsigned rice_parameter_limit,
3684	unsigned min_partition_order,
3685	unsigned max_partition_order,
3686	unsigned bps,
3687	FLAC__bool do_escape_coding,
3688	unsigned rice_parameter_search_dist,
3689	FLAC__EntropyCodingMethod *best_ecm
3690)
3691{
3692	unsigned residual_bits, best_residual_bits = 0;
3693	unsigned best_parameters_index = 0;
3694	unsigned best_partition_order = 0;
3695	const unsigned blocksize = residual_samples + predictor_order;
3696
3697	max_partition_order = FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_and_predictor_order(max_partition_order, blocksize, predictor_order);
3698	min_partition_order = min(min_partition_order, max_partition_order);
3699
3700	precompute_partition_info_sums_(residual, abs_residual_partition_sums, residual_samples, predictor_order, min_partition_order, max_partition_order, bps);
3701
3702	if(do_escape_coding)
3703		precompute_partition_info_escapes_(residual, raw_bits_per_partition, residual_samples, predictor_order, min_partition_order, max_partition_order);
3704
3705	{
3706		int partition_order;
3707		unsigned sum;
3708
3709		for(partition_order = (int)max_partition_order, sum = 0; partition_order >= (int)min_partition_order; partition_order--) {
3710			if(!
3711				set_partitioned_rice_(
3712#ifdef EXACT_RICE_BITS_CALCULATION
3713					residual,
3714#endif
3715					abs_residual_partition_sums+sum,
3716					raw_bits_per_partition+sum,
3717					residual_samples,
3718					predictor_order,
3719					rice_parameter,
3720					rice_parameter_limit,
3721					rice_parameter_search_dist,
3722					(unsigned)partition_order,
3723					do_escape_coding,
3724					&private_->partitioned_rice_contents_extra[!best_parameters_index],
3725					&residual_bits
3726				)
3727			)
3728			{
3729				FLAC__ASSERT(best_residual_bits != 0);
3730				break;
3731			}
3732			sum += 1u << partition_order;
3733			if(best_residual_bits == 0 || residual_bits < best_residual_bits) {
3734				best_residual_bits = residual_bits;
3735				best_parameters_index = !best_parameters_index;
3736				best_partition_order = partition_order;
3737			}
3738		}
3739	}
3740
3741	best_ecm->data.partitioned_rice.order = best_partition_order;
3742
3743	{
3744		/*
3745		 * We are allowed to de-const the pointer based on our special
3746		 * knowledge; it is const to the outside world.
3747		 */
3748		FLAC__EntropyCodingMethod_PartitionedRiceContents* prc = (FLAC__EntropyCodingMethod_PartitionedRiceContents*)best_ecm->data.partitioned_rice.contents;
3749		unsigned partition;
3750
3751		/* save best parameters and raw_bits */
3752		FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(prc, max(6, best_partition_order));
3753		memcpy(prc->parameters, private_->partitioned_rice_contents_extra[best_parameters_index].parameters, sizeof(unsigned)*(1<<(best_partition_order)));
3754		if(do_escape_coding)
3755			memcpy(prc->raw_bits, private_->partitioned_rice_contents_extra[best_parameters_index].raw_bits, sizeof(unsigned)*(1<<(best_partition_order)));
3756		/*
3757		 * Now need to check if the type should be changed to
3758		 * FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2 based on the
3759		 * size of the rice parameters.
3760		 */
3761		for(partition = 0; partition < (1u<<best_partition_order); partition++) {
3762			if(prc->parameters[partition] >= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER) {
3763				best_ecm->type = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2;
3764				break;
3765			}
3766		}
3767	}
3768
3769	return best_residual_bits;
3770}
3771
3772#if defined(FLAC__CPU_IA32) && !defined FLAC__NO_ASM && defined FLAC__HAS_NASM
3773extern void precompute_partition_info_sums_32bit_asm_ia32_(
3774	const FLAC__int32 residual[],
3775	FLAC__uint64 abs_residual_partition_sums[],
3776	unsigned blocksize,
3777	unsigned predictor_order,
3778	unsigned min_partition_order,
3779	unsigned max_partition_order
3780);
3781#endif
3782
3783void precompute_partition_info_sums_(
3784	const FLAC__int32 residual[],
3785	FLAC__uint64 abs_residual_partition_sums[],
3786	unsigned residual_samples,
3787	unsigned predictor_order,
3788	unsigned min_partition_order,
3789	unsigned max_partition_order,
3790	unsigned bps
3791)
3792{
3793	const unsigned default_partition_samples = (residual_samples + predictor_order) >> max_partition_order;
3794	unsigned partitions = 1u << max_partition_order;
3795
3796	FLAC__ASSERT(default_partition_samples > predictor_order);
3797
3798#if defined(FLAC__CPU_IA32) && !defined FLAC__NO_ASM && defined FLAC__HAS_NASM
3799	/* slightly pessimistic but still catches all common cases */
3800	/* WATCHOUT: "+ bps" is an assumption that the average residual magnitude will not be more than "bps" bits */
3801	if(FLAC__bitmath_ilog2(default_partition_samples) + bps < 32) {
3802		precompute_partition_info_sums_32bit_asm_ia32_(residual, abs_residual_partition_sums, residual_samples + predictor_order, predictor_order, min_partition_order, max_partition_order);
3803		return;
3804	}
3805#endif
3806
3807	/* first do max_partition_order */
3808	{
3809		unsigned partition, residual_sample, end = (unsigned)(-(int)predictor_order);
3810		/* slightly pessimistic but still catches all common cases */
3811		/* WATCHOUT: "+ bps" is an assumption that the average residual magnitude will not be more than "bps" bits */
3812		if(FLAC__bitmath_ilog2(default_partition_samples) + bps < 32) {
3813			FLAC__uint32 abs_residual_partition_sum;
3814
3815			for(partition = residual_sample = 0; partition < partitions; partition++) {
3816				end += default_partition_samples;
3817				abs_residual_partition_sum = 0;
3818				for( ; residual_sample < end; residual_sample++)
3819					abs_residual_partition_sum += abs(residual[residual_sample]); /* abs(INT_MIN) is undefined, but if the residual is INT_MIN we have bigger problems */
3820				abs_residual_partition_sums[partition] = abs_residual_partition_sum;
3821			}
3822		}
3823		else { /* have to pessimistically use 64 bits for accumulator */
3824			FLAC__uint64 abs_residual_partition_sum;
3825
3826			for(partition = residual_sample = 0; partition < partitions; partition++) {
3827				end += default_partition_samples;
3828				abs_residual_partition_sum = 0;
3829				for( ; residual_sample < end; residual_sample++)
3830					abs_residual_partition_sum += abs(residual[residual_sample]); /* abs(INT_MIN) is undefined, but if the residual is INT_MIN we have bigger problems */
3831				abs_residual_partition_sums[partition] = abs_residual_partition_sum;
3832			}
3833		}
3834	}
3835
3836	/* now merge partitions for lower orders */
3837	{
3838		unsigned from_partition = 0, to_partition = partitions;
3839		int partition_order;
3840		for(partition_order = (int)max_partition_order - 1; partition_order >= (int)min_partition_order; partition_order--) {
3841			unsigned i;
3842			partitions >>= 1;
3843			for(i = 0; i < partitions; i++) {
3844				abs_residual_partition_sums[to_partition++] =
3845					abs_residual_partition_sums[from_partition  ] +
3846					abs_residual_partition_sums[from_partition+1];
3847				from_partition += 2;
3848			}
3849		}
3850	}
3851}
3852
3853void precompute_partition_info_escapes_(
3854	const FLAC__int32 residual[],
3855	unsigned raw_bits_per_partition[],
3856	unsigned residual_samples,
3857	unsigned predictor_order,
3858	unsigned min_partition_order,
3859	unsigned max_partition_order
3860)
3861{
3862	int partition_order;
3863	unsigned from_partition, to_partition = 0;
3864	const unsigned blocksize = residual_samples + predictor_order;
3865
3866	/* first do max_partition_order */
3867	for(partition_order = (int)max_partition_order; partition_order >= 0; partition_order--) {
3868		FLAC__int32 r;
3869		FLAC__uint32 rmax;
3870		unsigned partition, partition_sample, partition_samples, residual_sample;
3871		const unsigned partitions = 1u << partition_order;
3872		const unsigned default_partition_samples = blocksize >> partition_order;
3873
3874		FLAC__ASSERT(default_partition_samples > predictor_order);
3875
3876		for(partition = residual_sample = 0; partition < partitions; partition++) {
3877			partition_samples = default_partition_samples;
3878			if(partition == 0)
3879				partition_samples -= predictor_order;
3880			rmax = 0;
3881			for(partition_sample = 0; partition_sample < partition_samples; partition_sample++) {
3882				r = residual[residual_sample++];
3883				/* OPT: maybe faster: rmax |= r ^ (r>>31) */
3884				if(r < 0)
3885					rmax |= ~r;
3886				else
3887					rmax |= r;
3888			}
3889			/* now we know all residual values are in the range [-rmax-1,rmax] */
3890			raw_bits_per_partition[partition] = rmax? FLAC__bitmath_ilog2(rmax) + 2 : 1;
3891		}
3892		to_partition = partitions;
3893		break; /*@@@ yuck, should remove the 'for' loop instead */
3894	}
3895
3896	/* now merge partitions for lower orders */
3897	for(from_partition = 0, --partition_order; partition_order >= (int)min_partition_order; partition_order--) {
3898		unsigned m;
3899		unsigned i;
3900		const unsigned partitions = 1u << partition_order;
3901		for(i = 0; i < partitions; i++) {
3902			m = raw_bits_per_partition[from_partition];
3903			from_partition++;
3904			raw_bits_per_partition[to_partition] = max(m, raw_bits_per_partition[from_partition]);
3905			from_partition++;
3906			to_partition++;
3907		}
3908	}
3909}
3910
3911#ifdef EXACT_RICE_BITS_CALCULATION
3912static FLaC__INLINE unsigned count_rice_bits_in_partition_(
3913	const unsigned rice_parameter,
3914	const unsigned partition_samples,
3915	const FLAC__int32 *residual
3916)
3917{
3918	unsigned i, partition_bits =
3919		FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN + /* actually could end up being FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN but err on side of 16bps */
3920		(1+rice_parameter) * partition_samples /* 1 for unary stop bit + rice_parameter for the binary portion */
3921	;
3922	for(i = 0; i < partition_samples; i++)
3923		partition_bits += ( (FLAC__uint32)((residual[i]<<1)^(residual[i]>>31)) >> rice_parameter );
3924	return partition_bits;
3925}
3926#else
3927static FLaC__INLINE unsigned count_rice_bits_in_partition_(
3928	const unsigned rice_parameter,
3929	const unsigned partition_samples,
3930	const FLAC__uint64 abs_residual_partition_sum
3931)
3932{
3933	return
3934		FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN + /* actually could end up being FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN but err on side of 16bps */
3935		(1+rice_parameter) * partition_samples + /* 1 for unary stop bit + rice_parameter for the binary portion */
3936		(
3937			rice_parameter?
3938				(unsigned)(abs_residual_partition_sum >> (rice_parameter-1)) /* rice_parameter-1 because the real coder sign-folds instead of using a sign bit */
3939				: (unsigned)(abs_residual_partition_sum << 1) /* can't shift by negative number, so reverse */
3940		)
3941		- (partition_samples >> 1)
3942		/* -(partition_samples>>1) to subtract out extra contributions to the abs_residual_partition_sum.
3943		 * The actual number of bits used is closer to the sum(for all i in the partition) of  abs(residual[i])>>(rice_parameter-1)
3944		 * By using the abs_residual_partition sum, we also add in bits in the LSBs that would normally be shifted out.
3945		 * So the subtraction term tries to guess how many extra bits were contributed.
3946		 * If the LSBs are randomly distributed, this should average to 0.5 extra bits per sample.
3947		 */
3948	;
3949}
3950#endif
3951
3952FLAC__bool set_partitioned_rice_(
3953#ifdef EXACT_RICE_BITS_CALCULATION
3954	const FLAC__int32 residual[],
3955#endif
3956	const FLAC__uint64 abs_residual_partition_sums[],
3957	const unsigned raw_bits_per_partition[],
3958	const unsigned residual_samples,
3959	const unsigned predictor_order,
3960	const unsigned suggested_rice_parameter,
3961	const unsigned rice_parameter_limit,
3962	const unsigned rice_parameter_search_dist,
3963	const unsigned partition_order,
3964	const FLAC__bool search_for_escapes,
3965	FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents,
3966	unsigned *bits
3967)
3968{
3969	unsigned rice_parameter, partition_bits;
3970	unsigned best_partition_bits, best_rice_parameter = 0;
3971	unsigned bits_ = FLAC__ENTROPY_CODING_METHOD_TYPE_LEN + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN;
3972	unsigned *parameters, *raw_bits;
3973#ifdef ENABLE_RICE_PARAMETER_SEARCH
3974	unsigned min_rice_parameter, max_rice_parameter;
3975#else
3976	(void)rice_parameter_search_dist;
3977#endif
3978
3979	FLAC__ASSERT(suggested_rice_parameter < FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER);
3980	FLAC__ASSERT(rice_parameter_limit <= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER);
3981
3982	FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(partitioned_rice_contents, max(6, partition_order));
3983	parameters = partitioned_rice_contents->parameters;
3984	raw_bits = partitioned_rice_contents->raw_bits;
3985
3986	if(partition_order == 0) {
3987		best_partition_bits = (unsigned)(-1);
3988#ifdef ENABLE_RICE_PARAMETER_SEARCH
3989		if(rice_parameter_search_dist) {
3990			if(suggested_rice_parameter < rice_parameter_search_dist)
3991				min_rice_parameter = 0;
3992			else
3993				min_rice_parameter = suggested_rice_parameter - rice_parameter_search_dist;
3994			max_rice_parameter = suggested_rice_parameter + rice_parameter_search_dist;
3995			if(max_rice_parameter >= rice_parameter_limit) {
3996#ifdef DEBUG_VERBOSE
3997				fprintf(stderr, "clipping rice_parameter (%u -> %u) @5\n", max_rice_parameter, rice_parameter_limit - 1);
3998#endif
3999				max_rice_parameter = rice_parameter_limit - 1;
4000			}
4001		}
4002		else
4003			min_rice_parameter = max_rice_parameter = suggested_rice_parameter;
4004
4005		for(rice_parameter = min_rice_parameter; rice_parameter <= max_rice_parameter; rice_parameter++) {
4006#else
4007			rice_parameter = suggested_rice_parameter;
4008#endif
4009#ifdef EXACT_RICE_BITS_CALCULATION
4010			partition_bits = count_rice_bits_in_partition_(rice_parameter, residual_samples, residual);
4011#else
4012			partition_bits = count_rice_bits_in_partition_(rice_parameter, residual_samples, abs_residual_partition_sums[0]);
4013#endif
4014			if(partition_bits < best_partition_bits) {
4015				best_rice_parameter = rice_parameter;
4016				best_partition_bits = partition_bits;
4017			}
4018#ifdef ENABLE_RICE_PARAMETER_SEARCH
4019		}
4020#endif
4021		if(search_for_escapes) {
4022			partition_bits = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN + raw_bits_per_partition[0] * residual_samples;
4023			if(partition_bits <= best_partition_bits) {
4024				raw_bits[0] = raw_bits_per_partition[0];
4025				best_rice_parameter = 0; /* will be converted to appropriate escape parameter later */
4026				best_partition_bits = partition_bits;
4027			}
4028			else
4029				raw_bits[0] = 0;
4030		}
4031		parameters[0] = best_rice_parameter;
4032		bits_ += best_partition_bits;
4033	}
4034	else {
4035		unsigned partition, residual_sample;
4036		unsigned partition_samples;
4037		FLAC__uint64 mean, k;
4038		const unsigned partitions = 1u << partition_order;
4039		for(partition = residual_sample = 0; partition < partitions; partition++) {
4040			partition_samples = (residual_samples+predictor_order) >> partition_order;
4041			if(partition == 0) {
4042				if(partition_samples <= predictor_order)
4043					return false;
4044				else
4045					partition_samples -= predictor_order;
4046			}
4047			mean = abs_residual_partition_sums[partition];
4048			/* we are basically calculating the size in bits of the
4049			 * average residual magnitude in the partition:
4050			 *   rice_parameter = floor(log2(mean/partition_samples))
4051			 * 'mean' is not a good name for the variable, it is
4052			 * actually the sum of magnitudes of all residual values
4053			 * in the partition, so the actual mean is
4054			 * mean/partition_samples
4055			 */
4056			for(rice_parameter = 0, k = partition_samples; k < mean; rice_parameter++, k <<= 1)
4057				;
4058			if(rice_parameter >= rice_parameter_limit) {
4059#ifdef DEBUG_VERBOSE
4060				fprintf(stderr, "clipping rice_parameter (%u -> %u) @6\n", rice_parameter, rice_parameter_limit - 1);
4061#endif
4062				rice_parameter = rice_parameter_limit - 1;
4063			}
4064
4065			best_partition_bits = (unsigned)(-1);
4066#ifdef ENABLE_RICE_PARAMETER_SEARCH
4067			if(rice_parameter_search_dist) {
4068				if(rice_parameter < rice_parameter_search_dist)
4069					min_rice_parameter = 0;
4070				else
4071					min_rice_parameter = rice_parameter - rice_parameter_search_dist;
4072				max_rice_parameter = rice_parameter + rice_parameter_search_dist;
4073				if(max_rice_parameter >= rice_parameter_limit) {
4074#ifdef DEBUG_VERBOSE
4075					fprintf(stderr, "clipping rice_parameter (%u -> %u) @7\n", max_rice_parameter, rice_parameter_limit - 1);
4076#endif
4077					max_rice_parameter = rice_parameter_limit - 1;
4078				}
4079			}
4080			else
4081				min_rice_parameter = max_rice_parameter = rice_parameter;
4082
4083			for(rice_parameter = min_rice_parameter; rice_parameter <= max_rice_parameter; rice_parameter++) {
4084#endif
4085#ifdef EXACT_RICE_BITS_CALCULATION
4086				partition_bits = count_rice_bits_in_partition_(rice_parameter, partition_samples, residual+residual_sample);
4087#else
4088				partition_bits = count_rice_bits_in_partition_(rice_parameter, partition_samples, abs_residual_partition_sums[partition]);
4089#endif
4090				if(partition_bits < best_partition_bits) {
4091					best_rice_parameter = rice_parameter;
4092					best_partition_bits = partition_bits;
4093				}
4094#ifdef ENABLE_RICE_PARAMETER_SEARCH
4095			}
4096#endif
4097			if(search_for_escapes) {
4098				partition_bits = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN + raw_bits_per_partition[partition] * partition_samples;
4099				if(partition_bits <= best_partition_bits) {
4100					raw_bits[partition] = raw_bits_per_partition[partition];
4101					best_rice_parameter = 0; /* will be converted to appropriate escape parameter later */
4102					best_partition_bits = partition_bits;
4103				}
4104				else
4105					raw_bits[partition] = 0;
4106			}
4107			parameters[partition] = best_rice_parameter;
4108			bits_ += best_partition_bits;
4109			residual_sample += partition_samples;
4110		}
4111	}
4112
4113	*bits = bits_;
4114	return true;
4115}
4116
4117unsigned get_wasted_bits_(FLAC__int32 signal[], unsigned samples)
4118{
4119	unsigned i, shift;
4120	FLAC__int32 x = 0;
4121
4122	for(i = 0; i < samples && !(x&1); i++)
4123		x |= signal[i];
4124
4125	if(x == 0) {
4126		shift = 0;
4127	}
4128	else {
4129		for(shift = 0; !(x&1); shift++)
4130			x >>= 1;
4131	}
4132
4133	if(shift > 0) {
4134		for(i = 0; i < samples; i++)
4135			 signal[i] >>= shift;
4136	}
4137
4138	return shift;
4139}
4140
4141void append_to_verify_fifo_(verify_input_fifo *fifo, const FLAC__int32 * const input[], unsigned input_offset, unsigned channels, unsigned wide_samples)
4142{
4143	unsigned channel;
4144
4145	for(channel = 0; channel < channels; channel++)
4146		memcpy(&fifo->data[channel][fifo->tail], &input[channel][input_offset], sizeof(FLAC__int32) * wide_samples);
4147
4148	fifo->tail += wide_samples;
4149
4150	FLAC__ASSERT(fifo->tail <= fifo->size);
4151}
4152
4153void append_to_verify_fifo_interleaved_(verify_input_fifo *fifo, const FLAC__int32 input[], unsigned input_offset, unsigned channels, unsigned wide_samples)
4154{
4155	unsigned channel;
4156	unsigned sample, wide_sample;
4157	unsigned tail = fifo->tail;
4158
4159	sample = input_offset * channels;
4160	for(wide_sample = 0; wide_sample < wide_samples; wide_sample++) {
4161		for(channel = 0; channel < channels; channel++)
4162			fifo->data[channel][tail] = input[sample++];
4163		tail++;
4164	}
4165	fifo->tail = tail;
4166
4167	FLAC__ASSERT(fifo->tail <= fifo->size);
4168}
4169
4170FLAC__StreamDecoderReadStatus verify_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data)
4171{
4172	FLAC__StreamEncoder *encoder = (FLAC__StreamEncoder*)client_data;
4173	const size_t encoded_bytes = encoder->private_->verify.output.bytes;
4174	(void)decoder;
4175
4176	if(encoder->private_->verify.needs_magic_hack) {
4177		FLAC__ASSERT(*bytes >= FLAC__STREAM_SYNC_LENGTH);
4178		*bytes = FLAC__STREAM_SYNC_LENGTH;
4179		memcpy(buffer, FLAC__STREAM_SYNC_STRING, *bytes);
4180		encoder->private_->verify.needs_magic_hack = false;
4181	}
4182	else {
4183		if(encoded_bytes == 0) {
4184			/*
4185			 * If we get here, a FIFO underflow has occurred,
4186			 * which means there is a bug somewhere.
4187			 */
4188			FLAC__ASSERT(0);
4189			return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
4190		}
4191		else if(encoded_bytes < *bytes)
4192			*bytes = encoded_bytes;
4193		memcpy(buffer, encoder->private_->verify.output.data, *bytes);
4194		encoder->private_->verify.output.data += *bytes;
4195		encoder->private_->verify.output.bytes -= *bytes;
4196	}
4197
4198	return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
4199}
4200
4201FLAC__StreamDecoderWriteStatus verify_write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
4202{
4203	FLAC__StreamEncoder *encoder = (FLAC__StreamEncoder *)client_data;
4204	unsigned channel;
4205	const unsigned channels = frame->header.channels;
4206	const unsigned blocksize = frame->header.blocksize;
4207	const unsigned bytes_per_block = sizeof(FLAC__int32) * blocksize;
4208
4209	(void)decoder;
4210
4211	for(channel = 0; channel < channels; channel++) {
4212		if(0 != memcmp(buffer[channel], encoder->private_->verify.input_fifo.data[channel], bytes_per_block)) {
4213			unsigned i, sample = 0;
4214			FLAC__int32 expect = 0, got = 0;
4215
4216			for(i = 0; i < blocksize; i++) {
4217				if(buffer[channel][i] != encoder->private_->verify.input_fifo.data[channel][i]) {
4218					sample = i;
4219					expect = (FLAC__int32)encoder->private_->verify.input_fifo.data[channel][i];
4220					got = (FLAC__int32)buffer[channel][i];
4221					break;
4222				}
4223			}
4224			FLAC__ASSERT(i < blocksize);
4225			FLAC__ASSERT(frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER);
4226			encoder->private_->verify.error_stats.absolute_sample = frame->header.number.sample_number + sample;
4227			encoder->private_->verify.error_stats.frame_number = (unsigned)(frame->header.number.sample_number / blocksize);
4228			encoder->private_->verify.error_stats.channel = channel;
4229			encoder->private_->verify.error_stats.sample = sample;
4230			encoder->private_->verify.error_stats.expected = expect;
4231			encoder->private_->verify.error_stats.got = got;
4232			encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA;
4233			return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
4234		}
4235	}
4236	/* dequeue the frame from the fifo */
4237	encoder->private_->verify.input_fifo.tail -= blocksize;
4238	FLAC__ASSERT(encoder->private_->verify.input_fifo.tail <= OVERREAD_);
4239	for(channel = 0; channel < channels; channel++)
4240		memmove(&encoder->private_->verify.input_fifo.data[channel][0], &encoder->private_->verify.input_fifo.data[channel][blocksize], encoder->private_->verify.input_fifo.tail * sizeof(encoder->private_->verify.input_fifo.data[0][0]));
4241	return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
4242}
4243
4244void verify_metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
4245{
4246	(void)decoder, (void)metadata, (void)client_data;
4247}
4248
4249void verify_error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
4250{
4251	FLAC__StreamEncoder *encoder = (FLAC__StreamEncoder*)client_data;
4252	(void)decoder, (void)status;
4253	encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR;
4254}
4255
4256FLAC__StreamEncoderReadStatus file_read_callback_(const FLAC__StreamEncoder *encoder, FLAC__byte buffer[], size_t *bytes, void *client_data)
4257{
4258	(void)client_data;
4259
4260	*bytes = fread(buffer, 1, *bytes, encoder->private_->file);
4261	if (*bytes == 0) {
4262		if (feof(encoder->private_->file))
4263			return FLAC__STREAM_ENCODER_READ_STATUS_END_OF_STREAM;
4264		else if (ferror(encoder->private_->file))
4265			return FLAC__STREAM_ENCODER_READ_STATUS_ABORT;
4266	}
4267	return FLAC__STREAM_ENCODER_READ_STATUS_CONTINUE;
4268}
4269
4270FLAC__StreamEncoderSeekStatus file_seek_callback_(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data)
4271{
4272	(void)client_data;
4273
4274	if(fseeko(encoder->private_->file, (off_t)absolute_byte_offset, SEEK_SET) < 0)
4275		return FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR;
4276	else
4277		return FLAC__STREAM_ENCODER_SEEK_STATUS_OK;
4278}
4279
4280FLAC__StreamEncoderTellStatus file_tell_callback_(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data)
4281{
4282	off_t offset;
4283
4284	(void)client_data;
4285
4286	offset = ftello(encoder->private_->file);
4287
4288	if(offset < 0) {
4289		return FLAC__STREAM_ENCODER_TELL_STATUS_ERROR;
4290	}
4291	else {
4292		*absolute_byte_offset = (FLAC__uint64)offset;
4293		return FLAC__STREAM_ENCODER_TELL_STATUS_OK;
4294	}
4295}
4296
4297#ifdef FLAC__VALGRIND_TESTING
4298static size_t local__fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
4299{
4300	size_t ret = fwrite(ptr, size, nmemb, stream);
4301	if(!ferror(stream))
4302		fflush(stream);
4303	return ret;
4304}
4305#else
4306#define local__fwrite fwrite
4307#endif
4308
4309FLAC__StreamEncoderWriteStatus file_write_callback_(const FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data)
4310{
4311	(void)client_data, (void)current_frame;
4312
4313	if(local__fwrite(buffer, sizeof(FLAC__byte), bytes, encoder->private_->file) == bytes) {
4314		FLAC__bool call_it = 0 != encoder->private_->progress_callback && (
4315#if FLAC__HAS_OGG
4316			/* We would like to be able to use 'samples > 0' in the
4317			 * clause here but currently because of the nature of our
4318			 * Ogg writing implementation, 'samples' is always 0 (see
4319			 * ogg_encoder_aspect.c).  The downside is extra progress
4320			 * callbacks.
4321			 */
4322			encoder->private_->is_ogg? true :
4323#endif
4324			samples > 0
4325		);
4326		if(call_it) {
4327			/* NOTE: We have to add +bytes, +samples, and +1 to the stats
4328			 * because at this point in the callback chain, the stats
4329			 * have not been updated.  Only after we return and control
4330			 * gets back to write_frame_() are the stats updated
4331			 */
4332			encoder->private_->progress_callback(encoder, encoder->private_->bytes_written+bytes, encoder->private_->samples_written+samples, encoder->private_->frames_written+(samples?1:0), encoder->private_->total_frames_estimate, encoder->private_->client_data);
4333		}
4334		return FLAC__STREAM_ENCODER_WRITE_STATUS_OK;
4335	}
4336	else
4337		return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR;
4338}
4339
4340/*
4341 * This will forcibly set stdout to binary mode (for OSes that require it)
4342 */
4343FILE *get_binary_stdout_(void)
4344{
4345	/* if something breaks here it is probably due to the presence or
4346	 * absence of an underscore before the identifiers 'setmode',
4347	 * 'fileno', and/or 'O_BINARY'; check your system header files.
4348	 */
4349#if defined _MSC_VER || defined __MINGW32__
4350	_setmode(_fileno(stdout), _O_BINARY);
4351#elif defined __CYGWIN__
4352	/* almost certainly not needed for any modern Cygwin, but let's be safe... */
4353	setmode(_fileno(stdout), _O_BINARY);
4354#elif defined __EMX__
4355	setmode(fileno(stdout), O_BINARY);
4356#endif
4357
4358	return stdout;
4359}
4360