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