09dcbc5ea9321797fe28efb154cd122ba2d432e3
[platform/upstream/flac.git] / src / libFLAC / stream_encoder.c
1 /* libFLAC - Free Lossless Audio Codec library
2  * Copyright (C) 2000,2001,2002  Josh Coalson
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA  02111-1307, USA.
18  */
19
20 #include <stdio.h>
21 #include <stdlib.h> /* for malloc() */
22 #include <string.h> /* for memcpy() */
23 #include "FLAC/assert.h"
24 #include "FLAC/stream_decoder.h"
25 #include "protected/stream_encoder.h"
26 #include "private/bitbuffer.h"
27 #include "private/bitmath.h"
28 #include "private/crc.h"
29 #include "private/cpu.h"
30 #include "private/stream_encoder_framing.h"
31 #include "private/fixed.h"
32 #include "private/lpc.h"
33 #include "private/md5.h"
34 #include "private/memory.h"
35
36 #ifdef min
37 #undef min
38 #endif
39 #define min(x,y) ((x)<(y)?(x):(y))
40
41 #ifdef max
42 #undef max
43 #endif
44 #define max(x,y) ((x)>(y)?(x):(y))
45
46 typedef struct {
47         FLAC__int32 *data[FLAC__MAX_CHANNELS];
48         unsigned size; /* of each data[] in samples */
49         unsigned tail;
50 } verify_input_fifo;
51
52 typedef struct {
53         const FLAC__byte *data;
54         unsigned capacity;
55         unsigned bytes;
56 } verify_output;
57
58 typedef enum {
59         ENCODER_IN_MAGIC = 0,
60         ENCODER_IN_METADATA = 1,
61         ENCODER_IN_AUDIO = 2
62 } EncoderStateHint;
63
64 /***********************************************************************
65  *
66  * Private class method prototypes
67  *
68  ***********************************************************************/
69
70 static void set_defaults_(FLAC__StreamEncoder *encoder);
71 static void free_(FLAC__StreamEncoder *encoder);
72 static FLAC__bool resize_buffers_(FLAC__StreamEncoder *encoder, unsigned new_size);
73 static FLAC__bool write_bitbuffer_(FLAC__StreamEncoder *encoder, unsigned samples);
74 static FLAC__bool process_frame_(FLAC__StreamEncoder *encoder, FLAC__bool is_last_frame);
75 static FLAC__bool process_subframes_(FLAC__StreamEncoder *encoder, FLAC__bool is_last_frame);
76 static FLAC__bool process_subframe_(FLAC__StreamEncoder *encoder, unsigned min_partition_order, unsigned max_partition_order, FLAC__bool precompute_partition_sums, FLAC__bool verbatim_only, const FLAC__FrameHeader *frame_header, unsigned subframe_bps, const FLAC__int32 integer_signal[], const FLAC__real real_signal[], FLAC__Subframe *subframe[2], FLAC__int32 *residual[2], unsigned *best_subframe, unsigned *best_bits);
77 static FLAC__bool add_subframe_(FLAC__StreamEncoder *encoder, const FLAC__FrameHeader *frame_header, unsigned subframe_bps, const FLAC__Subframe *subframe, FLAC__BitBuffer *frame);
78 static unsigned evaluate_constant_subframe_(const FLAC__int32 signal, unsigned subframe_bps, FLAC__Subframe *subframe);
79 static unsigned evaluate_fixed_subframe_(FLAC__StreamEncoder *encoder, const FLAC__int32 signal[], FLAC__int32 residual[], FLAC__uint32 abs_residual[], FLAC__uint64 abs_residual_partition_sums[], unsigned raw_bits_per_partition[], unsigned blocksize, unsigned subframe_bps, unsigned order, unsigned rice_parameter, unsigned min_partition_order, unsigned max_partition_order, FLAC__bool precompute_partition_sums, FLAC__bool do_escape_coding, unsigned rice_parameter_search_dist, FLAC__Subframe *subframe);
80 static unsigned evaluate_lpc_subframe_(FLAC__StreamEncoder *encoder, const FLAC__int32 signal[], FLAC__int32 residual[], FLAC__uint32 abs_residual[], FLAC__uint64 abs_residual_partition_sums[], unsigned raw_bits_per_partition[], const FLAC__real lp_coeff[], unsigned blocksize, unsigned subframe_bps, unsigned order, unsigned qlp_coeff_precision, unsigned rice_parameter, unsigned min_partition_order, unsigned max_partition_order, FLAC__bool precompute_partition_sums, FLAC__bool do_escape_coding, unsigned rice_parameter_search_dist, FLAC__Subframe *subframe);
81 static unsigned evaluate_verbatim_subframe_(const FLAC__int32 signal[], unsigned blocksize, unsigned subframe_bps, FLAC__Subframe *subframe);
82 static unsigned find_best_partition_order_(struct FLAC__StreamEncoderPrivate *private_, const FLAC__int32 residual[], FLAC__uint32 abs_residual[], FLAC__uint64 abs_residual_partition_sums[], unsigned raw_bits_per_partition[], unsigned residual_samples, unsigned predictor_order, unsigned rice_parameter, unsigned min_partition_order, unsigned max_partition_order, FLAC__bool precompute_partition_sums, FLAC__bool do_escape_coding, unsigned rice_parameter_search_dist, unsigned *best_partition_order, unsigned best_parameters[], unsigned best_raw_bits[]);
83 static void precompute_partition_info_sums_(const FLAC__uint32 abs_residual[], FLAC__uint64 abs_residual_partition_sums[], unsigned residual_samples, unsigned predictor_order, unsigned min_partition_order, unsigned max_partition_order);
84 static void precompute_partition_info_escapes_(const FLAC__int32 residual[], unsigned raw_bits_per_partition[], unsigned residual_samples, unsigned predictor_order, unsigned min_partition_order, unsigned max_partition_order);
85 #ifdef DONT_ESTIMATE_RICE_BITS
86 static FLAC__bool set_partitioned_rice_(const FLAC__uint32 abs_residual[], const FLAC__int32 residual[], const unsigned residual_samples, const unsigned predictor_order, const unsigned suggested_rice_parameter, const unsigned rice_parameter_search_dist, const unsigned partition_order, unsigned parameters[], unsigned *bits);
87 static FLAC__bool set_partitioned_rice_with_precompute_(const FLAC__int32 residual[], const FLAC__uint64 abs_residual_partition_sums[], const unsigned raw_bits_per_partition[], const unsigned residual_samples, const unsigned predictor_order, const unsigned suggested_rice_parameter, const unsigned rice_parameter_search_dist, const unsigned partition_order, const FLAC__bool search_for_escapes, unsigned parameters[], unsigned raw_bits[], unsigned *bits);
88 #else
89 static FLAC__bool set_partitioned_rice_(const FLAC__uint32 abs_residual[], const unsigned residual_samples, const unsigned predictor_order, const unsigned suggested_rice_parameter, const unsigned rice_parameter_search_dist, const unsigned partition_order, unsigned parameters[], unsigned *bits);
90 static FLAC__bool set_partitioned_rice_with_precompute_(const FLAC__uint32 abs_residual[], const FLAC__uint64 abs_residual_partition_sums[], const unsigned raw_bits_per_partition[], const unsigned residual_samples, const unsigned predictor_order, const unsigned suggested_rice_parameter, const unsigned rice_parameter_search_dist, const unsigned partition_order, const FLAC__bool search_for_escapes, unsigned parameters[], unsigned raw_bits[], unsigned *bits);
91 #endif
92 static unsigned get_wasted_bits_(FLAC__int32 signal[], unsigned samples);
93 /* verify-related routines: */
94 static void append_to_verify_fifo_(verify_input_fifo *fifo, const FLAC__int32 * const input[], unsigned input_offset, unsigned channels, unsigned wide_samples);
95 static void append_to_verify_fifo_interleaved_(verify_input_fifo *fifo, const FLAC__int32 input[], unsigned input_offset, unsigned channels, unsigned wide_samples);
96 static FLAC__StreamDecoderReadStatus verify_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data);
97 static FLAC__StreamDecoderWriteStatus verify_write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data);
98 static void verify_metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data);
99 static void verify_error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data);
100
101 /***********************************************************************
102  *
103  * Private class data
104  *
105  ***********************************************************************/
106
107 typedef struct FLAC__StreamEncoderPrivate {
108         unsigned input_capacity;                          /* current size (in samples) of the signal and residual buffers */
109         FLAC__int32 *integer_signal[FLAC__MAX_CHANNELS];  /* the integer version of the input signal */
110         FLAC__int32 *integer_signal_mid_side[2];          /* the integer version of the mid-side input signal (stereo only) */
111         FLAC__real *real_signal[FLAC__MAX_CHANNELS];      /* the floating-point version of the input signal */
112         FLAC__real *real_signal_mid_side[2];              /* the floating-point version of the mid-side input signal (stereo only) */
113         unsigned subframe_bps[FLAC__MAX_CHANNELS];        /* the effective bits per sample of the input signal (stream bps - wasted bits) */
114         unsigned subframe_bps_mid_side[2];                /* the effective bits per sample of the mid-side input signal (stream bps - wasted bits + 0/1) */
115         FLAC__int32 *residual_workspace[FLAC__MAX_CHANNELS][2]; /* each channel has a candidate and best workspace where the subframe residual signals will be stored */
116         FLAC__int32 *residual_workspace_mid_side[2][2];
117         FLAC__Subframe subframe_workspace[FLAC__MAX_CHANNELS][2];
118         FLAC__Subframe subframe_workspace_mid_side[2][2];
119         FLAC__Subframe *subframe_workspace_ptr[FLAC__MAX_CHANNELS][2];
120         FLAC__Subframe *subframe_workspace_ptr_mid_side[2][2];
121         unsigned best_subframe[FLAC__MAX_CHANNELS];       /* index into the above workspaces */
122         unsigned best_subframe_mid_side[2];
123         unsigned best_subframe_bits[FLAC__MAX_CHANNELS];  /* size in bits of the best subframe for each channel */
124         unsigned best_subframe_bits_mid_side[2];
125         FLAC__uint32 *abs_residual;                       /* workspace where abs(candidate residual) is stored */
126         FLAC__uint64 *abs_residual_partition_sums;        /* workspace where the sum of abs(candidate residual) for each partition is stored */
127         unsigned *raw_bits_per_partition;                 /* workspace where the sum of silog2(candidate residual) for each partition is stored */
128         FLAC__BitBuffer *frame;                           /* the current frame being worked on */
129         double loose_mid_side_stereo_frames_exact;        /* exact number of frames the encoder will use before trying both independent and mid/side frames again */
130         unsigned loose_mid_side_stereo_frames;            /* rounded number of frames the encoder will use before trying both independent and mid/side frames again */
131         unsigned loose_mid_side_stereo_frame_count;       /* number of frames using the current channel assignment */
132         FLAC__ChannelAssignment last_channel_assignment;
133         FLAC__StreamMetadata metadata;
134         unsigned current_sample_number;
135         unsigned current_frame_number;
136         struct MD5Context md5context;
137         FLAC__CPUInfo cpuinfo;
138         unsigned (*local_fixed_compute_best_predictor)(const FLAC__int32 data[], unsigned data_len, FLAC__real residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]);
139         void (*local_lpc_compute_autocorrelation)(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]);
140         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[]);
141         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[]);
142         FLAC__bool use_wide_by_block;          /* use slow 64-bit versions of some functions because of the block size */
143         FLAC__bool use_wide_by_partition;      /* use slow 64-bit versions of some functions because of the min partition order and blocksize */
144         FLAC__bool use_wide_by_order;          /* use slow 64-bit versions of some functions because of the lpc order */
145         FLAC__bool precompute_partition_sums;  /* our initial guess as to whether precomputing the partitions sums will be a speed improvement */
146         FLAC__StreamEncoderWriteCallback write_callback;
147         FLAC__StreamEncoderMetadataCallback metadata_callback;
148         void *client_data;
149         /* unaligned (original) pointers to allocated data */
150         FLAC__int32 *integer_signal_unaligned[FLAC__MAX_CHANNELS];
151         FLAC__int32 *integer_signal_mid_side_unaligned[2];
152         FLAC__real *real_signal_unaligned[FLAC__MAX_CHANNELS];
153         FLAC__real *real_signal_mid_side_unaligned[2];
154         FLAC__int32 *residual_workspace_unaligned[FLAC__MAX_CHANNELS][2];
155         FLAC__int32 *residual_workspace_mid_side_unaligned[2][2];
156         FLAC__uint32 *abs_residual_unaligned;
157         FLAC__uint64 *abs_residual_partition_sums_unaligned;
158         unsigned *raw_bits_per_partition_unaligned;
159         /*
160          * These fields have been moved here from private function local
161          * declarations merely to save stack space during encoding.
162          */
163         FLAC__real lp_coeff[FLAC__MAX_LPC_ORDER][FLAC__MAX_LPC_ORDER]; /* from process_subframe_() */
164         unsigned parameters[2][1 << FLAC__MAX_RICE_PARTITION_ORDER], raw_bits[2][1 << FLAC__MAX_RICE_PARTITION_ORDER]; /* from find_best_partition_order_() */
165         /*
166          * The data for the verify section
167          */
168         struct {
169                 FLAC__StreamDecoder *decoder;
170                 EncoderStateHint state_hint;
171                 FLAC__bool needs_magic_hack;
172                 verify_input_fifo input_fifo;
173                 verify_output output;
174                 struct {
175                         FLAC__uint64 absolute_sample;
176                         unsigned frame_number;
177                         unsigned channel;
178                         unsigned sample;
179                         FLAC__int32 expected;
180                         FLAC__int32 got;
181                 } error_stats;
182         } verify;
183         FLAC__bool is_being_deleted; /* if true, call to ..._finish() from ..._delete() will not call the callbacks */
184 } FLAC__StreamEncoderPrivate;
185
186 /***********************************************************************
187  *
188  * Public static class data
189  *
190  ***********************************************************************/
191
192 const char * const FLAC__StreamEncoderStateString[] = {
193         "FLAC__STREAM_ENCODER_OK",
194         "FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR",
195         "FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA",
196         "FLAC__STREAM_ENCODER_INVALID_CALLBACK",
197         "FLAC__STREAM_ENCODER_INVALID_NUMBER_OF_CHANNELS",
198         "FLAC__STREAM_ENCODER_INVALID_BITS_PER_SAMPLE",
199         "FLAC__STREAM_ENCODER_INVALID_SAMPLE_RATE",
200         "FLAC__STREAM_ENCODER_INVALID_BLOCK_SIZE",
201         "FLAC__STREAM_ENCODER_INVALID_QLP_COEFF_PRECISION",
202         "FLAC__STREAM_ENCODER_MID_SIDE_CHANNELS_MISMATCH",
203         "FLAC__STREAM_ENCODER_MID_SIDE_SAMPLE_SIZE_MISMATCH",
204         "FLAC__STREAM_ENCODER_ILLEGAL_MID_SIDE_FORCE",
205         "FLAC__STREAM_ENCODER_BLOCK_SIZE_TOO_SMALL_FOR_LPC_ORDER",
206         "FLAC__STREAM_ENCODER_NOT_STREAMABLE",
207         "FLAC__STREAM_ENCODER_FRAMING_ERROR",
208         "FLAC__STREAM_ENCODER_INVALID_METADATA",
209         "FLAC__STREAM_ENCODER_FATAL_ERROR_WHILE_ENCODING",
210         "FLAC__STREAM_ENCODER_FATAL_ERROR_WHILE_WRITING",
211         "FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR",
212         "FLAC__STREAM_ENCODER_ALREADY_INITIALIZED",
213         "FLAC__STREAM_ENCODER_UNINITIALIZED"
214 };
215
216 const char * const FLAC__StreamEncoderWriteStatusString[] = {
217         "FLAC__STREAM_ENCODER_WRITE_STATUS_OK",
218         "FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR"
219 };
220
221 /***********************************************************************
222  *
223  * Class constructor/destructor
224  *
225  */
226 FLAC__StreamEncoder *FLAC__stream_encoder_new()
227 {
228         FLAC__StreamEncoder *encoder;
229
230         FLAC__ASSERT(sizeof(int) >= 4); /* we want to die right away if this is not true */
231
232         encoder = (FLAC__StreamEncoder*)malloc(sizeof(FLAC__StreamEncoder));
233         if(encoder == 0) {
234                 return 0;
235         }
236         memset(encoder, 0, sizeof(FLAC__StreamEncoder));
237
238         encoder->protected_ = (FLAC__StreamEncoderProtected*)malloc(sizeof(FLAC__StreamEncoderProtected));
239         if(encoder->protected_ == 0) {
240                 free(encoder);
241                 return 0;
242         }
243         memset(encoder->protected_, 0, sizeof(FLAC__StreamEncoderProtected));
244
245         encoder->private_ = (FLAC__StreamEncoderPrivate*)malloc(sizeof(FLAC__StreamEncoderPrivate));
246         if(encoder->private_ == 0) {
247                 free(encoder->protected_);
248                 free(encoder);
249                 return 0;
250         }
251         memset(encoder->private_, 0, sizeof(FLAC__StreamEncoderPrivate));
252
253         encoder->private_->frame = FLAC__bitbuffer_new();
254         if(encoder->private_->frame == 0) {
255                 free(encoder->private_);
256                 free(encoder->protected_);
257                 free(encoder);
258                 return 0;
259         }
260
261         set_defaults_(encoder);
262
263         encoder->private_->is_being_deleted = false;
264         encoder->protected_->state = FLAC__STREAM_ENCODER_UNINITIALIZED;
265
266         return encoder;
267 }
268
269 void FLAC__stream_encoder_delete(FLAC__StreamEncoder *encoder)
270 {
271         FLAC__ASSERT(0 != encoder);
272         FLAC__ASSERT(0 != encoder->protected_);
273         FLAC__ASSERT(0 != encoder->private_);
274         FLAC__ASSERT(0 != encoder->private_->frame);
275
276         encoder->private_->is_being_deleted = true;
277
278         FLAC__stream_encoder_finish(encoder);
279
280         if(encoder->protected_->verify && 0 != encoder->private_->verify.decoder)
281                 FLAC__stream_decoder_delete(encoder->private_->verify.decoder);
282         FLAC__bitbuffer_delete(encoder->private_->frame);
283         free(encoder->private_);
284         free(encoder->protected_);
285         free(encoder);
286 }
287
288 /***********************************************************************
289  *
290  * Public class methods
291  *
292  ***********************************************************************/
293
294 FLAC__StreamEncoderState FLAC__stream_encoder_init(FLAC__StreamEncoder *encoder)
295 {
296         unsigned i;
297
298         FLAC__ASSERT(0 != encoder);
299
300         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
301                 return encoder->protected_->state = FLAC__STREAM_ENCODER_ALREADY_INITIALIZED;
302
303         encoder->protected_->state = FLAC__STREAM_ENCODER_OK;
304
305         if(0 == encoder->private_->write_callback || 0 == encoder->private_->metadata_callback)
306                 return encoder->protected_->state = FLAC__STREAM_ENCODER_INVALID_CALLBACK;
307
308         if(encoder->protected_->channels == 0 || encoder->protected_->channels > FLAC__MAX_CHANNELS)
309                 return encoder->protected_->state = FLAC__STREAM_ENCODER_INVALID_NUMBER_OF_CHANNELS;
310
311         if(encoder->protected_->do_mid_side_stereo && encoder->protected_->channels != 2)
312                 return encoder->protected_->state = FLAC__STREAM_ENCODER_MID_SIDE_CHANNELS_MISMATCH;
313
314         if(encoder->protected_->loose_mid_side_stereo && !encoder->protected_->do_mid_side_stereo)
315                 return encoder->protected_->state = FLAC__STREAM_ENCODER_ILLEGAL_MID_SIDE_FORCE;
316
317         if(encoder->protected_->bits_per_sample >= 32)
318                 encoder->protected_->do_mid_side_stereo = false; /* since we do 32-bit math, the side channel would have 33 bps and overflow */
319
320         if(encoder->protected_->bits_per_sample < FLAC__MIN_BITS_PER_SAMPLE || encoder->protected_->bits_per_sample > FLAC__REFERENCE_CODEC_MAX_BITS_PER_SAMPLE)
321                 return encoder->protected_->state = FLAC__STREAM_ENCODER_INVALID_BITS_PER_SAMPLE;
322
323         if(!FLAC__format_sample_rate_is_valid(encoder->protected_->sample_rate))
324                 return encoder->protected_->state = FLAC__STREAM_ENCODER_INVALID_SAMPLE_RATE;
325
326         if(encoder->protected_->blocksize < FLAC__MIN_BLOCK_SIZE || encoder->protected_->blocksize > FLAC__MAX_BLOCK_SIZE)
327                 return encoder->protected_->state = FLAC__STREAM_ENCODER_INVALID_BLOCK_SIZE;
328
329         if(encoder->protected_->blocksize < encoder->protected_->max_lpc_order)
330                 return encoder->protected_->state = FLAC__STREAM_ENCODER_BLOCK_SIZE_TOO_SMALL_FOR_LPC_ORDER;
331
332         if(encoder->protected_->qlp_coeff_precision == 0) {
333                 if(encoder->protected_->bits_per_sample < 16) {
334                         /* @@@ need some data about how to set this here w.r.t. blocksize and sample rate */
335                         /* @@@ until then we'll make a guess */
336                         encoder->protected_->qlp_coeff_precision = max(5, 2 + encoder->protected_->bits_per_sample / 2);
337                 }
338                 else if(encoder->protected_->bits_per_sample == 16) {
339                         if(encoder->protected_->blocksize <= 192)
340                                 encoder->protected_->qlp_coeff_precision = 7;
341                         else if(encoder->protected_->blocksize <= 384)
342                                 encoder->protected_->qlp_coeff_precision = 8;
343                         else if(encoder->protected_->blocksize <= 576)
344                                 encoder->protected_->qlp_coeff_precision = 9;
345                         else if(encoder->protected_->blocksize <= 1152)
346                                 encoder->protected_->qlp_coeff_precision = 10;
347                         else if(encoder->protected_->blocksize <= 2304)
348                                 encoder->protected_->qlp_coeff_precision = 11;
349                         else if(encoder->protected_->blocksize <= 4608)
350                                 encoder->protected_->qlp_coeff_precision = 12;
351                         else
352                                 encoder->protected_->qlp_coeff_precision = 13;
353                 }
354                 else {
355                         encoder->protected_->qlp_coeff_precision = min(13, 8*sizeof(FLAC__int32) - encoder->protected_->bits_per_sample - 1 - 2); /* @@@ -2 to keep things 32-bit safe */
356                 }
357         }
358         else if(encoder->protected_->qlp_coeff_precision < FLAC__MIN_QLP_COEFF_PRECISION || encoder->protected_->qlp_coeff_precision + encoder->protected_->bits_per_sample >= 8*sizeof(FLAC__uint32) || encoder->protected_->qlp_coeff_precision >= (1u<<FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN))
359                 return encoder->protected_->state = FLAC__STREAM_ENCODER_INVALID_QLP_COEFF_PRECISION;
360
361         if(encoder->protected_->streamable_subset) {
362                 /*@@@ add check for blocksize here */
363                 if(encoder->protected_->bits_per_sample != 8 && encoder->protected_->bits_per_sample != 12 && encoder->protected_->bits_per_sample != 16 && encoder->protected_->bits_per_sample != 20 && encoder->protected_->bits_per_sample != 24)
364                         return encoder->protected_->state = FLAC__STREAM_ENCODER_NOT_STREAMABLE;
365                 if(encoder->protected_->sample_rate > 655350)
366                         return encoder->protected_->state = FLAC__STREAM_ENCODER_NOT_STREAMABLE;
367         }
368
369         if(encoder->protected_->max_residual_partition_order >= (1u << FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN))
370                 encoder->protected_->max_residual_partition_order = (1u << FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN) - 1;
371         if(encoder->protected_->min_residual_partition_order >= encoder->protected_->max_residual_partition_order)
372                 encoder->protected_->min_residual_partition_order = encoder->protected_->max_residual_partition_order;
373
374         /* validate metadata */
375         if(0 == encoder->protected_->metadata && encoder->protected_->num_metadata_blocks > 0)
376                 return encoder->protected_->state = FLAC__STREAM_ENCODER_INVALID_METADATA;
377         for(i = 0; i < encoder->protected_->num_metadata_blocks; i++) {
378                 if(encoder->protected_->metadata[i]->type == FLAC__METADATA_TYPE_STREAMINFO)
379                         return encoder->protected_->state = FLAC__STREAM_ENCODER_INVALID_METADATA;
380                 else if(encoder->protected_->metadata[i]->type == FLAC__METADATA_TYPE_SEEKTABLE) {
381                         if(!FLAC__format_seektable_is_legal(&encoder->protected_->metadata[i]->data.seek_table))
382                                 return encoder->protected_->state = FLAC__STREAM_ENCODER_INVALID_METADATA;
383                 }
384         }
385
386         encoder->private_->input_capacity = 0;
387         for(i = 0; i < encoder->protected_->channels; i++) {
388                 encoder->private_->integer_signal_unaligned[i] = encoder->private_->integer_signal[i] = 0;
389                 encoder->private_->real_signal_unaligned[i] = encoder->private_->real_signal[i] = 0;
390         }
391         for(i = 0; i < 2; i++) {
392                 encoder->private_->integer_signal_mid_side_unaligned[i] = encoder->private_->integer_signal_mid_side[i] = 0;
393                 encoder->private_->real_signal_mid_side_unaligned[i] = encoder->private_->real_signal_mid_side[i] = 0;
394         }
395         for(i = 0; i < encoder->protected_->channels; i++) {
396                 encoder->private_->residual_workspace_unaligned[i][0] = encoder->private_->residual_workspace[i][0] = 0;
397                 encoder->private_->residual_workspace_unaligned[i][1] = encoder->private_->residual_workspace[i][1] = 0;
398                 encoder->private_->best_subframe[i] = 0;
399         }
400         for(i = 0; i < 2; i++) {
401                 encoder->private_->residual_workspace_mid_side_unaligned[i][0] = encoder->private_->residual_workspace_mid_side[i][0] = 0;
402                 encoder->private_->residual_workspace_mid_side_unaligned[i][1] = encoder->private_->residual_workspace_mid_side[i][1] = 0;
403                 encoder->private_->best_subframe_mid_side[i] = 0;
404         }
405         for(i = 0; i < encoder->protected_->channels; i++) {
406                 encoder->private_->subframe_workspace_ptr[i][0] = &encoder->private_->subframe_workspace[i][0];
407                 encoder->private_->subframe_workspace_ptr[i][1] = &encoder->private_->subframe_workspace[i][1];
408         }
409         for(i = 0; i < 2; i++) {
410                 encoder->private_->subframe_workspace_ptr_mid_side[i][0] = &encoder->private_->subframe_workspace_mid_side[i][0];
411                 encoder->private_->subframe_workspace_ptr_mid_side[i][1] = &encoder->private_->subframe_workspace_mid_side[i][1];
412         }
413         encoder->private_->abs_residual_unaligned = encoder->private_->abs_residual = 0;
414         encoder->private_->abs_residual_partition_sums_unaligned = encoder->private_->abs_residual_partition_sums = 0;
415         encoder->private_->raw_bits_per_partition_unaligned = encoder->private_->raw_bits_per_partition = 0;
416         encoder->private_->loose_mid_side_stereo_frames_exact = (double)encoder->protected_->sample_rate * 0.4 / (double)encoder->protected_->blocksize;
417         encoder->private_->loose_mid_side_stereo_frames = (unsigned)(encoder->private_->loose_mid_side_stereo_frames_exact + 0.5);
418         if(encoder->private_->loose_mid_side_stereo_frames == 0)
419                 encoder->private_->loose_mid_side_stereo_frames = 1;
420         encoder->private_->loose_mid_side_stereo_frame_count = 0;
421         encoder->private_->current_sample_number = 0;
422         encoder->private_->current_frame_number = 0;
423
424         encoder->private_->use_wide_by_block = (encoder->protected_->bits_per_sample + FLAC__bitmath_ilog2(encoder->protected_->blocksize)+1 > 30);
425         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? */
426         encoder->private_->use_wide_by_partition = (false); /*@@@ need to set this */
427
428         /*
429          * get the CPU info and set the function pointers
430          */
431         FLAC__cpu_info(&encoder->private_->cpuinfo);
432         /* first default to the non-asm routines */
433         encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation;
434         encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor;
435         encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients;
436         encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients;
437         /* now override with asm where appropriate */
438 #ifndef FLAC__NO_ASM
439         if(encoder->private_->cpuinfo.use_asm) {
440 #ifdef FLAC__CPU_IA32
441                 FLAC__ASSERT(encoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_IA32);
442 #ifdef FLAC__HAS_NASM
443                 if(0 && encoder->private_->cpuinfo.data.ia32.sse) {
444                         if(encoder->protected_->max_lpc_order < 4)
445                                 encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_4;
446                         else if(encoder->protected_->max_lpc_order < 8)
447                                 encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_8;
448                         else if(encoder->protected_->max_lpc_order < 12)
449                                 encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_12;
450                         else
451                                 encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32;
452                 }
453                 else if(encoder->private_->cpuinfo.data.ia32._3dnow)
454                         encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_3dnow;
455                 else
456                         encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32;
457                 if(encoder->private_->cpuinfo.data.ia32.mmx && encoder->private_->cpuinfo.data.ia32.cmov)
458                         encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_asm_ia32_mmx_cmov;
459                 if(encoder->private_->cpuinfo.data.ia32.mmx) {
460                         encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32;
461                         encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx;
462                 }
463                 else {
464                         encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32;
465                         encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32;
466                 }
467 #endif
468 #endif
469         }
470 #endif
471         /* finally override based on wide-ness if necessary */
472         if(encoder->private_->use_wide_by_block) {
473                 encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_wide;
474         }
475
476         /* we require precompute_partition_sums if do_escape_coding because of their intertwined nature */
477         encoder->private_->precompute_partition_sums = (encoder->protected_->max_residual_partition_order > encoder->protected_->min_residual_partition_order) || encoder->protected_->do_escape_coding;
478
479         if(!resize_buffers_(encoder, encoder->protected_->blocksize)) {
480                 /* the above function sets the state for us in case of an error */
481                 return encoder->protected_->state;
482         }
483
484         if(!FLAC__bitbuffer_init(encoder->private_->frame))
485                 return encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
486
487         /*
488          * Set up the verify stuff if necessary
489          */
490         if(encoder->protected_->verify) {
491                 /*
492                  * First, set up the fifo which will hold the
493                  * original signal to compare against
494                  */
495                 encoder->private_->verify.input_fifo.size = encoder->protected_->blocksize;
496                 for(i = 0; i < encoder->protected_->channels; i++) {
497                         if(0 == (encoder->private_->verify.input_fifo.data[i] = (FLAC__int32*)malloc(sizeof(FLAC__int32) * encoder->private_->verify.input_fifo.size)))
498                                 return encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
499                 }
500                 encoder->private_->verify.input_fifo.tail = 0;
501
502                 /*
503                  * Now set up a stream decoder for verification
504                  */
505                 encoder->private_->verify.decoder = FLAC__stream_decoder_new();
506                 if(0 == encoder->private_->verify.decoder)
507                         return encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR;
508
509                 FLAC__stream_decoder_set_read_callback(encoder->private_->verify.decoder, verify_read_callback_);
510                 FLAC__stream_decoder_set_write_callback(encoder->private_->verify.decoder, verify_write_callback_);
511                 FLAC__stream_decoder_set_metadata_callback(encoder->private_->verify.decoder, verify_metadata_callback_);
512                 FLAC__stream_decoder_set_error_callback(encoder->private_->verify.decoder, verify_error_callback_);
513                 FLAC__stream_decoder_set_client_data(encoder->private_->verify.decoder, encoder);
514                 if(FLAC__stream_decoder_init(encoder->private_->verify.decoder) != FLAC__STREAM_DECODER_SEARCH_FOR_METADATA)
515                         return encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR;
516         }
517         encoder->private_->verify.error_stats.absolute_sample = 0;
518         encoder->private_->verify.error_stats.frame_number = 0;
519         encoder->private_->verify.error_stats.channel = 0;
520         encoder->private_->verify.error_stats.sample = 0;
521         encoder->private_->verify.error_stats.expected = 0;
522         encoder->private_->verify.error_stats.got = 0;
523
524         /*
525          * write the stream header
526          */
527         if(encoder->protected_->verify)
528                 encoder->private_->verify.state_hint = ENCODER_IN_MAGIC;
529         if(!FLAC__bitbuffer_write_raw_uint32(encoder->private_->frame, FLAC__STREAM_SYNC, FLAC__STREAM_SYNC_LEN))
530                 return encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
531         if(!write_bitbuffer_(encoder, 0)) {
532                 /* the above function sets the state for us in case of an error */
533                 return encoder->protected_->state;
534         }
535
536         /*
537          * write the STREAMINFO metadata block
538          */
539         if(encoder->protected_->verify)
540                 encoder->private_->verify.state_hint = ENCODER_IN_METADATA;
541         encoder->private_->metadata.type = FLAC__METADATA_TYPE_STREAMINFO;
542         encoder->private_->metadata.is_last = (encoder->protected_->num_metadata_blocks == 0);
543         encoder->private_->metadata.length = FLAC__STREAM_METADATA_STREAMINFO_LENGTH;
544         encoder->private_->metadata.data.stream_info.min_blocksize = encoder->protected_->blocksize; /* this encoder uses the same blocksize for the whole stream */
545         encoder->private_->metadata.data.stream_info.max_blocksize = encoder->protected_->blocksize;
546         encoder->private_->metadata.data.stream_info.min_framesize = 0; /* we don't know this yet; have to fill it in later */
547         encoder->private_->metadata.data.stream_info.max_framesize = 0; /* we don't know this yet; have to fill it in later */
548         encoder->private_->metadata.data.stream_info.sample_rate = encoder->protected_->sample_rate;
549         encoder->private_->metadata.data.stream_info.channels = encoder->protected_->channels;
550         encoder->private_->metadata.data.stream_info.bits_per_sample = encoder->protected_->bits_per_sample;
551         encoder->private_->metadata.data.stream_info.total_samples = encoder->protected_->total_samples_estimate; /* we will replace this later with the real total */
552         memset(encoder->private_->metadata.data.stream_info.md5sum, 0, 16); /* we don't know this yet; have to fill it in later */
553         MD5Init(&encoder->private_->md5context);
554         if(!FLAC__bitbuffer_clear(encoder->private_->frame)) {
555                 encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
556                 return false;
557         }
558         if(!FLAC__add_metadata_block(&encoder->private_->metadata, encoder->private_->frame))
559                 return encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
560         if(!write_bitbuffer_(encoder, 0)) {
561                 /* the above function sets the state for us in case of an error */
562                 return encoder->protected_->state;
563         }
564
565         /*
566          * Now that the STREAMINFO block is written, we can init this to an
567          * absurdly-high value...
568          */
569         encoder->private_->metadata.data.stream_info.min_framesize = (1u << FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN) - 1;
570         /* ... and clear this to 0 */
571         encoder->private_->metadata.data.stream_info.total_samples = 0;
572
573         /*
574          * write the user's metadata blocks
575          */
576         for(i = 0; i < encoder->protected_->num_metadata_blocks; i++) {
577                 encoder->protected_->metadata[i]->is_last = (i == encoder->protected_->num_metadata_blocks - 1);
578                 if(!FLAC__bitbuffer_clear(encoder->private_->frame)) {
579                         encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
580                         return false;
581                 }
582                 if(!FLAC__add_metadata_block(encoder->protected_->metadata[i], encoder->private_->frame))
583                         return encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
584                 if(!write_bitbuffer_(encoder, 0)) {
585                         /* the above function sets the state for us in case of an error */
586                         return encoder->protected_->state;
587                 }
588         }
589
590         if(encoder->protected_->verify)
591                 encoder->private_->verify.state_hint = ENCODER_IN_AUDIO;
592
593         return encoder->protected_->state;
594 }
595
596 void FLAC__stream_encoder_finish(FLAC__StreamEncoder *encoder)
597 {
598         FLAC__ASSERT(0 != encoder);
599
600         if(encoder->protected_->state == FLAC__STREAM_ENCODER_UNINITIALIZED)
601                 return;
602
603         if(encoder->protected_->state == FLAC__STREAM_ENCODER_OK && !encoder->private_->is_being_deleted) {
604                 if(encoder->private_->current_sample_number != 0) {
605                         encoder->protected_->blocksize = encoder->private_->current_sample_number;
606                         process_frame_(encoder, true); /* true => is last frame */
607                 }
608         }
609
610         MD5Final(encoder->private_->metadata.data.stream_info.md5sum, &encoder->private_->md5context);
611
612         if(encoder->protected_->state == FLAC__STREAM_ENCODER_OK && !encoder->private_->is_being_deleted) {
613                 encoder->private_->metadata_callback(encoder, &encoder->private_->metadata, encoder->private_->client_data);
614         }
615
616         if(encoder->protected_->verify && 0 != encoder->private_->verify.decoder)
617                 FLAC__stream_decoder_finish(encoder->private_->verify.decoder);
618
619         free_(encoder);
620         set_defaults_(encoder);
621
622         encoder->protected_->state = FLAC__STREAM_ENCODER_UNINITIALIZED;
623 }
624
625 FLAC__bool FLAC__stream_encoder_set_verify(FLAC__StreamEncoder *encoder, FLAC__bool value)
626 {
627         FLAC__ASSERT(0 != encoder);
628         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
629                 return false;
630         encoder->protected_->verify = value;
631         return true;
632 }
633
634 FLAC__bool FLAC__stream_encoder_set_streamable_subset(FLAC__StreamEncoder *encoder, FLAC__bool value)
635 {
636         FLAC__ASSERT(0 != encoder);
637         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
638                 return false;
639         encoder->protected_->streamable_subset = value;
640         return true;
641 }
642
643 FLAC__bool FLAC__stream_encoder_set_do_mid_side_stereo(FLAC__StreamEncoder *encoder, FLAC__bool value)
644 {
645         FLAC__ASSERT(0 != encoder);
646         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
647                 return false;
648         encoder->protected_->do_mid_side_stereo = value;
649         return true;
650 }
651
652 FLAC__bool FLAC__stream_encoder_set_loose_mid_side_stereo(FLAC__StreamEncoder *encoder, FLAC__bool value)
653 {
654         FLAC__ASSERT(0 != encoder);
655         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
656                 return false;
657         encoder->protected_->loose_mid_side_stereo = value;
658         return true;
659 }
660
661 FLAC__bool FLAC__stream_encoder_set_channels(FLAC__StreamEncoder *encoder, unsigned value)
662 {
663         FLAC__ASSERT(0 != encoder);
664         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
665                 return false;
666         encoder->protected_->channels = value;
667         return true;
668 }
669
670 FLAC__bool FLAC__stream_encoder_set_bits_per_sample(FLAC__StreamEncoder *encoder, unsigned value)
671 {
672         FLAC__ASSERT(0 != encoder);
673         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
674                 return false;
675         encoder->protected_->bits_per_sample = value;
676         return true;
677 }
678
679 FLAC__bool FLAC__stream_encoder_set_sample_rate(FLAC__StreamEncoder *encoder, unsigned value)
680 {
681         FLAC__ASSERT(0 != encoder);
682         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
683                 return false;
684         encoder->protected_->sample_rate = value;
685         return true;
686 }
687
688 FLAC__bool FLAC__stream_encoder_set_blocksize(FLAC__StreamEncoder *encoder, unsigned value)
689 {
690         FLAC__ASSERT(0 != encoder);
691         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
692                 return false;
693         encoder->protected_->blocksize = value;
694         return true;
695 }
696
697 FLAC__bool FLAC__stream_encoder_set_max_lpc_order(FLAC__StreamEncoder *encoder, unsigned value)
698 {
699         FLAC__ASSERT(0 != encoder);
700         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
701                 return false;
702         encoder->protected_->max_lpc_order = value;
703         return true;
704 }
705
706 FLAC__bool FLAC__stream_encoder_set_qlp_coeff_precision(FLAC__StreamEncoder *encoder, unsigned value)
707 {
708         FLAC__ASSERT(0 != encoder);
709         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
710                 return false;
711         encoder->protected_->qlp_coeff_precision = value;
712         return true;
713 }
714
715 FLAC__bool FLAC__stream_encoder_set_do_qlp_coeff_prec_search(FLAC__StreamEncoder *encoder, FLAC__bool value)
716 {
717         FLAC__ASSERT(0 != encoder);
718         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
719                 return false;
720         encoder->protected_->do_qlp_coeff_prec_search = value;
721         return true;
722 }
723
724 FLAC__bool FLAC__stream_encoder_set_do_escape_coding(FLAC__StreamEncoder *encoder, FLAC__bool value)
725 {
726         FLAC__ASSERT(0 != encoder);
727         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
728                 return false;
729 #if 0
730         /*@@@ deprecated: */
731         encoder->protected_->do_escape_coding = value;
732 #else
733         (void)value;
734 #endif
735         return true;
736 }
737
738 FLAC__bool FLAC__stream_encoder_set_do_exhaustive_model_search(FLAC__StreamEncoder *encoder, FLAC__bool value)
739 {
740         FLAC__ASSERT(0 != encoder);
741         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
742                 return false;
743         encoder->protected_->do_exhaustive_model_search = value;
744         return true;
745 }
746
747 FLAC__bool FLAC__stream_encoder_set_min_residual_partition_order(FLAC__StreamEncoder *encoder, unsigned value)
748 {
749         FLAC__ASSERT(0 != encoder);
750         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
751                 return false;
752         encoder->protected_->min_residual_partition_order = value;
753         return true;
754 }
755
756 FLAC__bool FLAC__stream_encoder_set_max_residual_partition_order(FLAC__StreamEncoder *encoder, unsigned value)
757 {
758         FLAC__ASSERT(0 != encoder);
759         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
760                 return false;
761         encoder->protected_->max_residual_partition_order = value;
762         return true;
763 }
764
765 FLAC__bool FLAC__stream_encoder_set_rice_parameter_search_dist(FLAC__StreamEncoder *encoder, unsigned value)
766 {
767         FLAC__ASSERT(0 != encoder);
768         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
769                 return false;
770 #if 0
771         /*@@@ deprecated: */
772         encoder->protected_->rice_parameter_search_dist = value;
773 #else
774         (void)value;
775 #endif
776         return true;
777 }
778
779 FLAC__bool FLAC__stream_encoder_set_total_samples_estimate(FLAC__StreamEncoder *encoder, FLAC__uint64 value)
780 {
781         FLAC__ASSERT(0 != encoder);
782         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
783                 return false;
784         encoder->protected_->total_samples_estimate = value;
785         return true;
786 }
787
788 FLAC__bool FLAC__stream_encoder_set_metadata(FLAC__StreamEncoder *encoder, FLAC__StreamMetadata **metadata, unsigned num_blocks)
789 {
790         FLAC__ASSERT(0 != encoder);
791         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
792                 return false;
793         encoder->protected_->metadata = metadata;
794         encoder->protected_->num_metadata_blocks = num_blocks;
795         return true;
796 }
797
798 FLAC__bool FLAC__stream_encoder_set_write_callback(FLAC__StreamEncoder *encoder, FLAC__StreamEncoderWriteCallback value)
799 {
800         FLAC__ASSERT(0 != encoder);
801         FLAC__ASSERT(0 != value);
802         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
803                 return false;
804         encoder->private_->write_callback = value;
805         return true;
806 }
807
808 FLAC__bool FLAC__stream_encoder_set_metadata_callback(FLAC__StreamEncoder *encoder, FLAC__StreamEncoderMetadataCallback value)
809 {
810         FLAC__ASSERT(0 != encoder);
811         FLAC__ASSERT(0 != value);
812         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
813                 return false;
814         encoder->private_->metadata_callback = value;
815         return true;
816 }
817
818 FLAC__bool FLAC__stream_encoder_set_client_data(FLAC__StreamEncoder *encoder, void *value)
819 {
820         FLAC__ASSERT(0 != encoder);
821         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
822                 return false;
823         encoder->private_->client_data = value;
824         return true;
825 }
826
827 FLAC__StreamEncoderState FLAC__stream_encoder_get_state(const FLAC__StreamEncoder *encoder)
828 {
829         FLAC__ASSERT(0 != encoder);
830         return encoder->protected_->state;
831 }
832
833 FLAC__StreamDecoderState FLAC__stream_encoder_get_verify_decoder_state(const FLAC__StreamEncoder *encoder)
834 {
835         FLAC__ASSERT(0 != encoder);
836         if(encoder->protected_->verify)
837                 return FLAC__stream_decoder_get_state(encoder->private_->verify.decoder);
838         else
839                 return FLAC__STREAM_DECODER_UNINITIALIZED;
840 }
841
842 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)
843 {
844         FLAC__ASSERT(0 != encoder);
845         if(0 != absolute_sample)
846                 *absolute_sample = encoder->private_->verify.error_stats.absolute_sample;
847         if(0 != frame_number)
848                 *frame_number = encoder->private_->verify.error_stats.frame_number;
849         if(0 != channel)
850                 *channel = encoder->private_->verify.error_stats.channel;
851         if(0 != sample)
852                 *sample = encoder->private_->verify.error_stats.sample;
853         if(0 != expected)
854                 *expected = encoder->private_->verify.error_stats.expected;
855         if(0 != got)
856                 *got = encoder->private_->verify.error_stats.got;
857 }
858
859 FLAC__bool FLAC__stream_encoder_get_verify(const FLAC__StreamEncoder *encoder)
860 {
861         FLAC__ASSERT(0 != encoder);
862         return encoder->protected_->verify;
863 }
864
865 FLAC__bool FLAC__stream_encoder_get_streamable_subset(const FLAC__StreamEncoder *encoder)
866 {
867         FLAC__ASSERT(0 != encoder);
868         return encoder->protected_->streamable_subset;
869 }
870
871 FLAC__bool FLAC__stream_encoder_get_do_mid_side_stereo(const FLAC__StreamEncoder *encoder)
872 {
873         FLAC__ASSERT(0 != encoder);
874         return encoder->protected_->do_mid_side_stereo;
875 }
876
877 FLAC__bool FLAC__stream_encoder_get_loose_mid_side_stereo(const FLAC__StreamEncoder *encoder)
878 {
879         FLAC__ASSERT(0 != encoder);
880         return encoder->protected_->loose_mid_side_stereo;
881 }
882
883 unsigned FLAC__stream_encoder_get_channels(const FLAC__StreamEncoder *encoder)
884 {
885         FLAC__ASSERT(0 != encoder);
886         return encoder->protected_->channels;
887 }
888
889 unsigned FLAC__stream_encoder_get_bits_per_sample(const FLAC__StreamEncoder *encoder)
890 {
891         FLAC__ASSERT(0 != encoder);
892         return encoder->protected_->bits_per_sample;
893 }
894
895 unsigned FLAC__stream_encoder_get_sample_rate(const FLAC__StreamEncoder *encoder)
896 {
897         FLAC__ASSERT(0 != encoder);
898         return encoder->protected_->sample_rate;
899 }
900
901 unsigned FLAC__stream_encoder_get_blocksize(const FLAC__StreamEncoder *encoder)
902 {
903         FLAC__ASSERT(0 != encoder);
904         return encoder->protected_->blocksize;
905 }
906
907 unsigned FLAC__stream_encoder_get_max_lpc_order(const FLAC__StreamEncoder *encoder)
908 {
909         FLAC__ASSERT(0 != encoder);
910         return encoder->protected_->max_lpc_order;
911 }
912
913 unsigned FLAC__stream_encoder_get_qlp_coeff_precision(const FLAC__StreamEncoder *encoder)
914 {
915         FLAC__ASSERT(0 != encoder);
916         return encoder->protected_->qlp_coeff_precision;
917 }
918
919 FLAC__bool FLAC__stream_encoder_get_do_qlp_coeff_prec_search(const FLAC__StreamEncoder *encoder)
920 {
921         FLAC__ASSERT(0 != encoder);
922         return encoder->protected_->do_qlp_coeff_prec_search;
923 }
924
925 FLAC__bool FLAC__stream_encoder_get_do_escape_coding(const FLAC__StreamEncoder *encoder)
926 {
927         FLAC__ASSERT(0 != encoder);
928         return encoder->protected_->do_escape_coding;
929 }
930
931 FLAC__bool FLAC__stream_encoder_get_do_exhaustive_model_search(const FLAC__StreamEncoder *encoder)
932 {
933         FLAC__ASSERT(0 != encoder);
934         return encoder->protected_->do_exhaustive_model_search;
935 }
936
937 unsigned FLAC__stream_encoder_get_min_residual_partition_order(const FLAC__StreamEncoder *encoder)
938 {
939         FLAC__ASSERT(0 != encoder);
940         return encoder->protected_->min_residual_partition_order;
941 }
942
943 unsigned FLAC__stream_encoder_get_max_residual_partition_order(const FLAC__StreamEncoder *encoder)
944 {
945         FLAC__ASSERT(0 != encoder);
946         return encoder->protected_->max_residual_partition_order;
947 }
948
949 unsigned FLAC__stream_encoder_get_rice_parameter_search_dist(const FLAC__StreamEncoder *encoder)
950 {
951         FLAC__ASSERT(0 != encoder);
952         return encoder->protected_->rice_parameter_search_dist;
953 }
954
955 FLAC__uint64 FLAC__stream_encoder_get_total_samples_estimate(const FLAC__StreamEncoder *encoder)
956 {
957         FLAC__ASSERT(0 != encoder);
958         return encoder->protected_->total_samples_estimate;
959 }
960
961 FLAC__bool FLAC__stream_encoder_process(FLAC__StreamEncoder *encoder, const FLAC__int32 * const buffer[], unsigned samples)
962 {
963         unsigned i, j, channel;
964         FLAC__int32 x, mid, side;
965         const unsigned channels = encoder->protected_->channels, blocksize = encoder->protected_->blocksize;
966
967         FLAC__ASSERT(0 != encoder);
968         FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK);
969
970         j = 0;
971         if(encoder->protected_->do_mid_side_stereo && channels == 2) {
972                 do {
973                         if(encoder->protected_->verify)
974                                 append_to_verify_fifo_(&encoder->private_->verify.input_fifo, buffer, j, channels, min(blocksize-encoder->private_->current_sample_number, samples-j));
975
976                         for(i = encoder->private_->current_sample_number; i < blocksize && j < samples; i++, j++) {
977                                 x = mid = side = buffer[0][j];
978                                 encoder->private_->integer_signal[0][i] = x;
979                                 encoder->private_->real_signal[0][i] = (FLAC__real)x;
980                                 x = buffer[1][j];
981                                 encoder->private_->integer_signal[1][i] = x;
982                                 encoder->private_->real_signal[1][i] = (FLAC__real)x;
983                                 mid += x;
984                                 side -= x;
985                                 mid >>= 1; /* NOTE: not the same as 'mid = (buffer[0][j] + buffer[1][j]) / 2' ! */
986                                 encoder->private_->integer_signal_mid_side[1][i] = side;
987                                 encoder->private_->integer_signal_mid_side[0][i] = mid;
988                                 encoder->private_->real_signal_mid_side[1][i] = (FLAC__real)side;
989                                 encoder->private_->real_signal_mid_side[0][i] = (FLAC__real)mid;
990                                 encoder->private_->current_sample_number++;
991                         }
992                         if(i == blocksize) {
993                                 if(!process_frame_(encoder, false)) /* false => not last frame */
994                                         return false;
995                         }
996                 } while(j < samples);
997         }
998         else {
999                 do {
1000                         if(encoder->protected_->verify)
1001                                 append_to_verify_fifo_(&encoder->private_->verify.input_fifo, buffer, j, channels, min(blocksize-encoder->private_->current_sample_number, samples-j));
1002
1003                         for(i = encoder->private_->current_sample_number; i < blocksize && j < samples; i++, j++) {
1004                                 for(channel = 0; channel < channels; channel++) {
1005                                         x = buffer[channel][j];
1006                                         encoder->private_->integer_signal[channel][i] = x;
1007                                         encoder->private_->real_signal[channel][i] = (FLAC__real)x;
1008                                 }
1009                                 encoder->private_->current_sample_number++;
1010                         }
1011                         if(i == blocksize) {
1012                                 if(!process_frame_(encoder, false)) /* false => not last frame */
1013                                         return false;
1014                         }
1015                 } while(j < samples);
1016         }
1017
1018         return true;
1019 }
1020
1021 FLAC__bool FLAC__stream_encoder_process_interleaved(FLAC__StreamEncoder *encoder, const FLAC__int32 buffer[], unsigned samples)
1022 {
1023         unsigned i, j, k, channel;
1024         FLAC__int32 x, mid, side;
1025         const unsigned channels = encoder->protected_->channels, blocksize = encoder->protected_->blocksize;
1026
1027         FLAC__ASSERT(0 != encoder);
1028         FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK);
1029
1030         j = k = 0;
1031         if(encoder->protected_->do_mid_side_stereo && channels == 2) {
1032                 do {
1033                         if(encoder->protected_->verify)
1034                                 append_to_verify_fifo_interleaved_(&encoder->private_->verify.input_fifo, buffer, j, channels, min(blocksize-encoder->private_->current_sample_number, samples-j));
1035
1036                         for(i = encoder->private_->current_sample_number; i < blocksize && j < samples; i++, j++) {
1037                                 x = mid = side = buffer[k++];
1038                                 encoder->private_->integer_signal[0][i] = x;
1039                                 encoder->private_->real_signal[0][i] = (FLAC__real)x;
1040                                 x = buffer[k++];
1041                                 encoder->private_->integer_signal[1][i] = x;
1042                                 encoder->private_->real_signal[1][i] = (FLAC__real)x;
1043                                 mid += x;
1044                                 side -= x;
1045                                 mid >>= 1; /* NOTE: not the same as 'mid = (left + right) / 2' ! */
1046                                 encoder->private_->integer_signal_mid_side[1][i] = side;
1047                                 encoder->private_->integer_signal_mid_side[0][i] = mid;
1048                                 encoder->private_->real_signal_mid_side[1][i] = (FLAC__real)side;
1049                                 encoder->private_->real_signal_mid_side[0][i] = (FLAC__real)mid;
1050                                 encoder->private_->current_sample_number++;
1051                         }
1052                         if(i == blocksize) {
1053                                 if(!process_frame_(encoder, false)) /* false => not last frame */
1054                                         return false;
1055                         }
1056                 } while(j < samples);
1057         }
1058         else {
1059                 do {
1060                         if(encoder->protected_->verify)
1061                                 append_to_verify_fifo_interleaved_(&encoder->private_->verify.input_fifo, buffer, j, channels, min(blocksize-encoder->private_->current_sample_number, samples-j));
1062
1063                         for(i = encoder->private_->current_sample_number; i < blocksize && j < samples; i++, j++) {
1064                                 for(channel = 0; channel < channels; channel++) {
1065                                         x = buffer[k++];
1066                                         encoder->private_->integer_signal[channel][i] = x;
1067                                         encoder->private_->real_signal[channel][i] = (FLAC__real)x;
1068                                 }
1069                                 encoder->private_->current_sample_number++;
1070                         }
1071                         if(i == blocksize) {
1072                                 if(!process_frame_(encoder, false)) /* false => not last frame */
1073                                         return false;
1074                         }
1075                 } while(j < samples);
1076         }
1077
1078         return true;
1079 }
1080
1081 /***********************************************************************
1082  *
1083  * Private class methods
1084  *
1085  ***********************************************************************/
1086
1087 void set_defaults_(FLAC__StreamEncoder *encoder)
1088 {
1089         FLAC__ASSERT(0 != encoder);
1090
1091         encoder->protected_->verify = false;
1092         encoder->protected_->streamable_subset = true;
1093         encoder->protected_->do_mid_side_stereo = false;
1094         encoder->protected_->loose_mid_side_stereo = false;
1095         encoder->protected_->channels = 2;
1096         encoder->protected_->bits_per_sample = 16;
1097         encoder->protected_->sample_rate = 44100;
1098         encoder->protected_->blocksize = 1152;
1099         encoder->protected_->max_lpc_order = 0;
1100         encoder->protected_->qlp_coeff_precision = 0;
1101         encoder->protected_->do_qlp_coeff_prec_search = false;
1102         encoder->protected_->do_exhaustive_model_search = false;
1103         encoder->protected_->do_escape_coding = false;
1104         encoder->protected_->min_residual_partition_order = 0;
1105         encoder->protected_->max_residual_partition_order = 0;
1106         encoder->protected_->rice_parameter_search_dist = 0;
1107         encoder->protected_->total_samples_estimate = 0;
1108         encoder->protected_->metadata = 0;
1109         encoder->protected_->num_metadata_blocks = 0;
1110
1111         encoder->private_->write_callback = 0;
1112         encoder->private_->metadata_callback = 0;
1113         encoder->private_->client_data = 0;
1114 }
1115
1116 void free_(FLAC__StreamEncoder *encoder)
1117 {
1118         unsigned i, channel;
1119
1120         FLAC__ASSERT(0 != encoder);
1121         for(i = 0; i < encoder->protected_->channels; i++) {
1122                 if(0 != encoder->private_->integer_signal_unaligned[i]) {
1123                         free(encoder->private_->integer_signal_unaligned[i]);
1124                         encoder->private_->integer_signal_unaligned[i] = 0;
1125                 }
1126                 if(0 != encoder->private_->real_signal_unaligned[i]) {
1127                         free(encoder->private_->real_signal_unaligned[i]);
1128                         encoder->private_->real_signal_unaligned[i] = 0;
1129                 }
1130         }
1131         for(i = 0; i < 2; i++) {
1132                 if(0 != encoder->private_->integer_signal_mid_side_unaligned[i]) {
1133                         free(encoder->private_->integer_signal_mid_side_unaligned[i]);
1134                         encoder->private_->integer_signal_mid_side_unaligned[i] = 0;
1135                 }
1136                 if(0 != encoder->private_->real_signal_mid_side_unaligned[i]) {
1137                         free(encoder->private_->real_signal_mid_side_unaligned[i]);
1138                         encoder->private_->real_signal_mid_side_unaligned[i] = 0;
1139                 }
1140         }
1141         for(channel = 0; channel < encoder->protected_->channels; channel++) {
1142                 for(i = 0; i < 2; i++) {
1143                         if(0 != encoder->private_->residual_workspace_unaligned[channel][i]) {
1144                                 free(encoder->private_->residual_workspace_unaligned[channel][i]);
1145                                 encoder->private_->residual_workspace_unaligned[channel][i] = 0;
1146                         }
1147                 }
1148         }
1149         for(channel = 0; channel < 2; channel++) {
1150                 for(i = 0; i < 2; i++) {
1151                         if(0 != encoder->private_->residual_workspace_mid_side_unaligned[channel][i]) {
1152                                 free(encoder->private_->residual_workspace_mid_side_unaligned[channel][i]);
1153                                 encoder->private_->residual_workspace_mid_side_unaligned[channel][i] = 0;
1154                         }
1155                 }
1156         }
1157         if(0 != encoder->private_->abs_residual_unaligned) {
1158                 free(encoder->private_->abs_residual_unaligned);
1159                 encoder->private_->abs_residual_unaligned = 0;
1160         }
1161         if(0 != encoder->private_->abs_residual_partition_sums_unaligned) {
1162                 free(encoder->private_->abs_residual_partition_sums_unaligned);
1163                 encoder->private_->abs_residual_partition_sums_unaligned = 0;
1164         }
1165         if(0 != encoder->private_->raw_bits_per_partition_unaligned) {
1166                 free(encoder->private_->raw_bits_per_partition_unaligned);
1167                 encoder->private_->raw_bits_per_partition_unaligned = 0;
1168         }
1169         if(encoder->protected_->verify) {
1170                 for(i = 0; i < encoder->protected_->channels; i++) {
1171                         if(0 != encoder->private_->verify.input_fifo.data[i]) {
1172                                 free(encoder->private_->verify.input_fifo.data[i]);
1173                                 encoder->private_->verify.input_fifo.data[i] = 0;
1174                         }
1175                 }
1176         }
1177         FLAC__bitbuffer_free(encoder->private_->frame);
1178 }
1179
1180 FLAC__bool resize_buffers_(FLAC__StreamEncoder *encoder, unsigned new_size)
1181 {
1182         FLAC__bool ok;
1183         unsigned i, channel;
1184
1185         FLAC__ASSERT(new_size > 0);
1186         FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK);
1187         FLAC__ASSERT(encoder->private_->current_sample_number == 0);
1188
1189         /* To avoid excessive malloc'ing, we only grow the buffer; no shrinking. */
1190         if(new_size <= encoder->private_->input_capacity)
1191                 return true;
1192
1193         ok = true;
1194
1195         /* WATCHOUT: FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx() requires that the input arrays (in our case the integer signals) have a buffer of up to 3 zeroes in front (at negative indices) for alignment purposes; we use 4 to keep the data well-aligned. */
1196
1197         for(i = 0; ok && i < encoder->protected_->channels; i++) {
1198                 ok = ok && FLAC__memory_alloc_aligned_int32_array(new_size+4, &encoder->private_->integer_signal_unaligned[i], &encoder->private_->integer_signal[i]);
1199                 ok = ok && FLAC__memory_alloc_aligned_real_array(new_size, &encoder->private_->real_signal_unaligned[i], &encoder->private_->real_signal[i]);
1200                 memset(encoder->private_->integer_signal[i], 0, sizeof(FLAC__int32)*4);
1201                 encoder->private_->integer_signal[i] += 4;
1202         }
1203         for(i = 0; ok && i < 2; i++) {
1204                 ok = ok && FLAC__memory_alloc_aligned_int32_array(new_size+4, &encoder->private_->integer_signal_mid_side_unaligned[i], &encoder->private_->integer_signal_mid_side[i]);
1205                 ok = ok && FLAC__memory_alloc_aligned_real_array(new_size, &encoder->private_->real_signal_mid_side_unaligned[i], &encoder->private_->real_signal_mid_side[i]);
1206                 memset(encoder->private_->integer_signal_mid_side[i], 0, sizeof(FLAC__int32)*4);
1207                 encoder->private_->integer_signal_mid_side[i] += 4;
1208         }
1209         for(channel = 0; ok && channel < encoder->protected_->channels; channel++) {
1210                 for(i = 0; ok && i < 2; i++) {
1211                         ok = ok && FLAC__memory_alloc_aligned_int32_array(new_size, &encoder->private_->residual_workspace_unaligned[channel][i], &encoder->private_->residual_workspace[channel][i]);
1212                 }
1213         }
1214         for(channel = 0; ok && channel < 2; channel++) {
1215                 for(i = 0; ok && i < 2; i++) {
1216                         ok = ok && FLAC__memory_alloc_aligned_int32_array(new_size, &encoder->private_->residual_workspace_mid_side_unaligned[channel][i], &encoder->private_->residual_workspace_mid_side[channel][i]);
1217                 }
1218         }
1219         ok = ok && FLAC__memory_alloc_aligned_uint32_array(new_size, &encoder->private_->abs_residual_unaligned, &encoder->private_->abs_residual);
1220         if(encoder->private_->precompute_partition_sums || encoder->protected_->do_escape_coding) /* we require precompute_partition_sums if do_escape_coding because of their intertwined nature */
1221                 ok = ok && FLAC__memory_alloc_aligned_uint64_array(new_size * 2, &encoder->private_->abs_residual_partition_sums_unaligned, &encoder->private_->abs_residual_partition_sums);
1222         if(encoder->protected_->do_escape_coding)
1223                 ok = ok && FLAC__memory_alloc_aligned_unsigned_array(new_size * 2, &encoder->private_->raw_bits_per_partition_unaligned, &encoder->private_->raw_bits_per_partition);
1224
1225         if(ok)
1226                 encoder->private_->input_capacity = new_size;
1227         else
1228                 encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
1229
1230         return ok;
1231 }
1232
1233 FLAC__bool write_bitbuffer_(FLAC__StreamEncoder *encoder, unsigned samples)
1234 {
1235         const FLAC__byte *buffer;
1236         unsigned bytes;
1237
1238         FLAC__ASSERT(FLAC__bitbuffer_is_byte_aligned(encoder->private_->frame));
1239
1240         FLAC__bitbuffer_get_buffer(encoder->private_->frame, &buffer, &bytes);
1241
1242         if(encoder->protected_->verify) {
1243                 encoder->private_->verify.output.data = buffer;
1244                 encoder->private_->verify.output.bytes = bytes;
1245                 if(encoder->private_->verify.state_hint == ENCODER_IN_MAGIC) {
1246                         encoder->private_->verify.needs_magic_hack = true;
1247                 }
1248                 else {
1249                         if(!FLAC__stream_decoder_process_single(encoder->private_->verify.decoder)) {
1250                                 FLAC__bitbuffer_release_buffer(encoder->private_->frame);
1251                                 if(encoder->protected_->state != FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA)
1252                                         encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR;
1253                                 return false;
1254                         }
1255                 }
1256         }
1257
1258         if(encoder->private_->write_callback(encoder, buffer, bytes, samples, encoder->private_->current_frame_number, encoder->private_->client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) {
1259                 encoder->protected_->state = FLAC__STREAM_ENCODER_FATAL_ERROR_WHILE_WRITING;
1260                 return false;
1261         }
1262
1263         FLAC__bitbuffer_release_buffer(encoder->private_->frame);
1264
1265         if(samples > 0) {
1266                 encoder->private_->metadata.data.stream_info.min_framesize = min(bytes, encoder->private_->metadata.data.stream_info.min_framesize);
1267                 encoder->private_->metadata.data.stream_info.max_framesize = max(bytes, encoder->private_->metadata.data.stream_info.max_framesize);
1268         }
1269
1270         return true;
1271 }
1272
1273 FLAC__bool process_frame_(FLAC__StreamEncoder *encoder, FLAC__bool is_last_frame)
1274 {
1275         FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK);
1276
1277         /*
1278          * Accumulate raw signal to the MD5 signature
1279          */
1280         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)) {
1281                 encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
1282                 return false;
1283         }
1284
1285         /*
1286          * Process the frame header and subframes into the frame bitbuffer
1287          */
1288         if(!process_subframes_(encoder, is_last_frame)) {
1289                 /* the above function sets the state for us in case of an error */
1290                 return false;
1291         }
1292
1293         /*
1294          * Zero-pad the frame to a byte_boundary
1295          */
1296         if(!FLAC__bitbuffer_zero_pad_to_byte_boundary(encoder->private_->frame)) {
1297                 encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
1298                 return false;
1299         }
1300
1301         /*
1302          * CRC-16 the whole thing
1303          */
1304         FLAC__ASSERT(FLAC__bitbuffer_is_byte_aligned(encoder->private_->frame));
1305         FLAC__bitbuffer_write_raw_uint32(encoder->private_->frame, FLAC__bitbuffer_get_write_crc16(encoder->private_->frame), FLAC__FRAME_FOOTER_CRC_LEN);
1306
1307         /*
1308          * Write it
1309          */
1310         if(!write_bitbuffer_(encoder, encoder->protected_->blocksize)) {
1311                 /* the above function sets the state for us in case of an error */
1312                 return false;
1313         }
1314
1315         /*
1316          * Get ready for the next frame
1317          */
1318         encoder->private_->current_sample_number = 0;
1319         encoder->private_->current_frame_number++;
1320         encoder->private_->metadata.data.stream_info.total_samples += (FLAC__uint64)encoder->protected_->blocksize;
1321
1322         return true;
1323 }
1324
1325 FLAC__bool process_subframes_(FLAC__StreamEncoder *encoder, FLAC__bool is_last_frame)
1326 {
1327         FLAC__FrameHeader frame_header;
1328         unsigned channel, min_partition_order = encoder->protected_->min_residual_partition_order, max_partition_order;
1329         FLAC__bool do_independent, do_mid_side, precompute_partition_sums;
1330
1331         /*
1332          * Calculate the min,max Rice partition orders
1333          */
1334         if(is_last_frame) {
1335                 max_partition_order = 0;
1336         }
1337         else {
1338                 unsigned limit = 0, b = encoder->protected_->blocksize;
1339                 while(!(b & 1)) {
1340                         limit++;
1341                         b >>= 1;
1342                 }
1343                 max_partition_order = min(encoder->protected_->max_residual_partition_order, limit);
1344         }
1345         min_partition_order = min(min_partition_order, max_partition_order);
1346
1347         precompute_partition_sums = encoder->private_->precompute_partition_sums && ((max_partition_order > min_partition_order) || encoder->protected_->do_escape_coding);
1348
1349         /*
1350          * Setup the frame
1351          */
1352         if(!FLAC__bitbuffer_clear(encoder->private_->frame)) {
1353                 encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
1354                 return false;
1355         }
1356         frame_header.blocksize = encoder->protected_->blocksize;
1357         frame_header.sample_rate = encoder->protected_->sample_rate;
1358         frame_header.channels = encoder->protected_->channels;
1359         frame_header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT; /* the default unless the encoder determines otherwise */
1360         frame_header.bits_per_sample = encoder->protected_->bits_per_sample;
1361         frame_header.number_type = FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER;
1362         frame_header.number.frame_number = encoder->private_->current_frame_number;
1363
1364         /*
1365          * Figure out what channel assignments to try
1366          */
1367         if(encoder->protected_->do_mid_side_stereo) {
1368                 if(encoder->protected_->loose_mid_side_stereo) {
1369                         if(encoder->private_->loose_mid_side_stereo_frame_count == 0) {
1370                                 do_independent = true;
1371                                 do_mid_side = true;
1372                         }
1373                         else {
1374                                 do_independent = (encoder->private_->last_channel_assignment == FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT);
1375                                 do_mid_side = !do_independent;
1376                         }
1377                 }
1378                 else {
1379                         do_independent = true;
1380                         do_mid_side = true;
1381                 }
1382         }
1383         else {
1384                 do_independent = true;
1385                 do_mid_side = false;
1386         }
1387
1388         FLAC__ASSERT(do_independent || do_mid_side);
1389
1390         /*
1391          * Check for wasted bits; set effective bps for each subframe
1392          */
1393         if(do_independent) {
1394                 unsigned w;
1395                 for(channel = 0; channel < encoder->protected_->channels; channel++) {
1396                         w = get_wasted_bits_(encoder->private_->integer_signal[channel], encoder->protected_->blocksize);
1397                         encoder->private_->subframe_workspace[channel][0].wasted_bits = encoder->private_->subframe_workspace[channel][1].wasted_bits = w;
1398                         encoder->private_->subframe_bps[channel] = encoder->protected_->bits_per_sample - w;
1399                 }
1400         }
1401         if(do_mid_side) {
1402                 unsigned w;
1403                 FLAC__ASSERT(encoder->protected_->channels == 2);
1404                 for(channel = 0; channel < 2; channel++) {
1405                         w = get_wasted_bits_(encoder->private_->integer_signal_mid_side[channel], encoder->protected_->blocksize);
1406                         encoder->private_->subframe_workspace_mid_side[channel][0].wasted_bits = encoder->private_->subframe_workspace_mid_side[channel][1].wasted_bits = w;
1407                         encoder->private_->subframe_bps_mid_side[channel] = encoder->protected_->bits_per_sample - w + (channel==0? 0:1);
1408                 }
1409         }
1410
1411         /*
1412          * First do a normal encoding pass of each independent channel
1413          */
1414         if(do_independent) {
1415                 for(channel = 0; channel < encoder->protected_->channels; channel++) {
1416                         if(!process_subframe_(encoder, min_partition_order, max_partition_order, precompute_partition_sums, false, &frame_header, encoder->private_->subframe_bps[channel], encoder->private_->integer_signal[channel], encoder->private_->real_signal[channel], encoder->private_->subframe_workspace_ptr[channel], encoder->private_->residual_workspace[channel], encoder->private_->best_subframe+channel, encoder->private_->best_subframe_bits+channel))
1417                                 return false;
1418                 }
1419         }
1420
1421         /*
1422          * Now do mid and side channels if requested
1423          */
1424         if(do_mid_side) {
1425                 FLAC__ASSERT(encoder->protected_->channels == 2);
1426
1427                 for(channel = 0; channel < 2; channel++) {
1428                         if(!process_subframe_(encoder, min_partition_order, max_partition_order, precompute_partition_sums, false, &frame_header, encoder->private_->subframe_bps_mid_side[channel], encoder->private_->integer_signal_mid_side[channel], encoder->private_->real_signal_mid_side[channel], encoder->private_->subframe_workspace_ptr_mid_side[channel], encoder->private_->residual_workspace_mid_side[channel], encoder->private_->best_subframe_mid_side+channel, encoder->private_->best_subframe_bits_mid_side+channel))
1429                                 return false;
1430                 }
1431         }
1432
1433         /*
1434          * Compose the frame bitbuffer
1435          */
1436         if(do_mid_side) {
1437                 unsigned left_bps = 0, right_bps = 0; /* initialized only to prevent superfluous compiler warning */
1438                 FLAC__Subframe *left_subframe = 0, *right_subframe = 0; /* initialized only to prevent superfluous compiler warning */
1439                 FLAC__ChannelAssignment channel_assignment;
1440
1441                 FLAC__ASSERT(encoder->protected_->channels == 2);
1442
1443                 if(encoder->protected_->loose_mid_side_stereo && encoder->private_->loose_mid_side_stereo_frame_count > 0) {
1444                         channel_assignment = (encoder->private_->last_channel_assignment == FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT? FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT : FLAC__CHANNEL_ASSIGNMENT_MID_SIDE);
1445                 }
1446                 else {
1447                         unsigned bits[4]; /* WATCHOUT - indexed by FLAC__ChannelAssignment */
1448                         unsigned min_bits;
1449                         FLAC__ChannelAssignment ca;
1450
1451                         FLAC__ASSERT(do_independent && do_mid_side);
1452
1453                         /* We have to figure out which channel assignent results in the smallest frame */
1454                         bits[FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT] = encoder->private_->best_subframe_bits         [0] + encoder->private_->best_subframe_bits         [1];
1455                         bits[FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE  ] = encoder->private_->best_subframe_bits         [0] + encoder->private_->best_subframe_bits_mid_side[1];
1456                         bits[FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE ] = encoder->private_->best_subframe_bits         [1] + encoder->private_->best_subframe_bits_mid_side[1];
1457                         bits[FLAC__CHANNEL_ASSIGNMENT_MID_SIDE   ] = encoder->private_->best_subframe_bits_mid_side[0] + encoder->private_->best_subframe_bits_mid_side[1];
1458
1459                         for(channel_assignment = 0, min_bits = bits[0], ca = 1; ca <= 3; ca++) {
1460                                 if(bits[ca] < min_bits) {
1461                                         min_bits = bits[ca];
1462                                         channel_assignment = ca;
1463                                 }
1464                         }
1465                 }
1466
1467                 frame_header.channel_assignment = channel_assignment;
1468
1469                 if(!FLAC__frame_add_header(&frame_header, encoder->protected_->streamable_subset, is_last_frame, encoder->private_->frame)) {
1470                         encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
1471                         return false;
1472                 }
1473
1474                 switch(channel_assignment) {
1475                         case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT:
1476                                 left_subframe  = &encoder->private_->subframe_workspace         [0][encoder->private_->best_subframe         [0]];
1477                                 right_subframe = &encoder->private_->subframe_workspace         [1][encoder->private_->best_subframe         [1]];
1478                                 break;
1479                         case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE:
1480                                 left_subframe  = &encoder->private_->subframe_workspace         [0][encoder->private_->best_subframe         [0]];
1481                                 right_subframe = &encoder->private_->subframe_workspace_mid_side[1][encoder->private_->best_subframe_mid_side[1]];
1482                                 break;
1483                         case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE:
1484                                 left_subframe  = &encoder->private_->subframe_workspace_mid_side[1][encoder->private_->best_subframe_mid_side[1]];
1485                                 right_subframe = &encoder->private_->subframe_workspace         [1][encoder->private_->best_subframe         [1]];
1486                                 break;
1487                         case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE:
1488                                 left_subframe  = &encoder->private_->subframe_workspace_mid_side[0][encoder->private_->best_subframe_mid_side[0]];
1489                                 right_subframe = &encoder->private_->subframe_workspace_mid_side[1][encoder->private_->best_subframe_mid_side[1]];
1490                                 break;
1491                         default:
1492                                 FLAC__ASSERT(0);
1493                 }
1494
1495                 switch(channel_assignment) {
1496                         case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT:
1497                                 left_bps  = encoder->private_->subframe_bps         [0];
1498                                 right_bps = encoder->private_->subframe_bps         [1];
1499                                 break;
1500                         case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE:
1501                                 left_bps  = encoder->private_->subframe_bps         [0];
1502                                 right_bps = encoder->private_->subframe_bps_mid_side[1];
1503                                 break;
1504                         case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE:
1505                                 left_bps  = encoder->private_->subframe_bps_mid_side[1];
1506                                 right_bps = encoder->private_->subframe_bps         [1];
1507                                 break;
1508                         case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE:
1509                                 left_bps  = encoder->private_->subframe_bps_mid_side[0];
1510                                 right_bps = encoder->private_->subframe_bps_mid_side[1];
1511                                 break;
1512                         default:
1513                                 FLAC__ASSERT(0);
1514                 }
1515
1516                 /* note that encoder_add_subframe_ sets the state for us in case of an error */
1517                 if(!add_subframe_(encoder, &frame_header, left_bps , left_subframe , encoder->private_->frame))
1518                         return false;
1519                 if(!add_subframe_(encoder, &frame_header, right_bps, right_subframe, encoder->private_->frame))
1520                         return false;
1521         }
1522         else {
1523                 if(!FLAC__frame_add_header(&frame_header, encoder->protected_->streamable_subset, is_last_frame, encoder->private_->frame)) {
1524                         encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
1525                         return false;
1526                 }
1527
1528                 for(channel = 0; channel < encoder->protected_->channels; channel++) {
1529                         if(!add_subframe_(encoder, &frame_header, encoder->private_->subframe_bps[channel], &encoder->private_->subframe_workspace[channel][encoder->private_->best_subframe[channel]], encoder->private_->frame)) {
1530                                 /* the above function sets the state for us in case of an error */
1531                                 return false;
1532                         }
1533                 }
1534         }
1535
1536         if(encoder->protected_->loose_mid_side_stereo) {
1537                 encoder->private_->loose_mid_side_stereo_frame_count++;
1538                 if(encoder->private_->loose_mid_side_stereo_frame_count >= encoder->private_->loose_mid_side_stereo_frames)
1539                         encoder->private_->loose_mid_side_stereo_frame_count = 0;
1540         }
1541
1542         encoder->private_->last_channel_assignment = frame_header.channel_assignment;
1543
1544         return true;
1545 }
1546
1547 FLAC__bool process_subframe_(FLAC__StreamEncoder *encoder, unsigned min_partition_order, unsigned max_partition_order, FLAC__bool precompute_partition_sums, FLAC__bool verbatim_only, const FLAC__FrameHeader *frame_header, unsigned subframe_bps, const FLAC__int32 integer_signal[], const FLAC__real real_signal[], FLAC__Subframe *subframe[2], FLAC__int32 *residual[2], unsigned *best_subframe, unsigned *best_bits)
1548 {
1549         FLAC__real fixed_residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1];
1550         FLAC__real lpc_residual_bits_per_sample;
1551         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 */
1552         FLAC__real lpc_error[FLAC__MAX_LPC_ORDER];
1553         unsigned min_lpc_order, max_lpc_order, lpc_order;
1554         unsigned min_fixed_order, max_fixed_order, guess_fixed_order, fixed_order;
1555         unsigned min_qlp_coeff_precision, max_qlp_coeff_precision, qlp_coeff_precision;
1556         unsigned rice_parameter;
1557         unsigned _candidate_bits, _best_bits;
1558         unsigned _best_subframe;
1559
1560         /* verbatim subframe is the baseline against which we measure other compressed subframes */
1561         _best_subframe = 0;
1562         _best_bits = evaluate_verbatim_subframe_(integer_signal, frame_header->blocksize, subframe_bps, subframe[_best_subframe]);
1563
1564         if(!verbatim_only && frame_header->blocksize >= FLAC__MAX_FIXED_ORDER) {
1565                 /* check for constant subframe */
1566                 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);
1567                 if(fixed_residual_bits_per_sample[1] == 0.0) {
1568                         /* the above means integer_signal+FLAC__MAX_FIXED_ORDER is constant, now we just have to check the warmup samples */
1569                         unsigned i, signal_is_constant = true;
1570                         for(i = 1; i <= FLAC__MAX_FIXED_ORDER; i++) {
1571                                 if(integer_signal[0] != integer_signal[i]) {
1572                                         signal_is_constant = false;
1573                                         break;
1574                                 }
1575                         }
1576                         if(signal_is_constant) {
1577                                 _candidate_bits = evaluate_constant_subframe_(integer_signal[0], subframe_bps, subframe[!_best_subframe]);
1578                                 if(_candidate_bits < _best_bits) {
1579                                         _best_subframe = !_best_subframe;
1580                                         _best_bits = _candidate_bits;
1581                                 }
1582                         }
1583                 }
1584                 else {
1585                         /* encode fixed */
1586                         if(encoder->protected_->do_exhaustive_model_search) {
1587                                 min_fixed_order = 0;
1588                                 max_fixed_order = FLAC__MAX_FIXED_ORDER;
1589                         }
1590                         else {
1591                                 min_fixed_order = max_fixed_order = guess_fixed_order;
1592                         }
1593                         for(fixed_order = min_fixed_order; fixed_order <= max_fixed_order; fixed_order++) {
1594                                 if(fixed_residual_bits_per_sample[fixed_order] >= (FLAC__real)subframe_bps)
1595                                         continue; /* don't even try */
1596                                 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 */
1597 #ifndef FLAC__SYMMETRIC_RICE
1598                                 rice_parameter++; /* to account for the signed->unsigned conversion during rice coding */
1599 #endif
1600                                 if(rice_parameter >= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER) {
1601 #ifdef DEBUG_VERBOSE
1602                                         fprintf(stderr, "clipping rice_parameter (%u -> %u) @0\n", rice_parameter, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1);
1603 #endif
1604                                         rice_parameter = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1;
1605                                 }
1606                                 _candidate_bits = evaluate_fixed_subframe_(encoder, integer_signal, residual[!_best_subframe], encoder->private_->abs_residual, encoder->private_->abs_residual_partition_sums, encoder->private_->raw_bits_per_partition, frame_header->blocksize, subframe_bps, fixed_order, rice_parameter, min_partition_order, max_partition_order, precompute_partition_sums, encoder->protected_->do_escape_coding, encoder->protected_->rice_parameter_search_dist, subframe[!_best_subframe]);
1607                                 if(_candidate_bits < _best_bits) {
1608                                         _best_subframe = !_best_subframe;
1609                                         _best_bits = _candidate_bits;
1610                                 }
1611                         }
1612
1613                         /* encode lpc */
1614                         if(encoder->protected_->max_lpc_order > 0) {
1615                                 if(encoder->protected_->max_lpc_order >= frame_header->blocksize)
1616                                         max_lpc_order = frame_header->blocksize-1;
1617                                 else
1618                                         max_lpc_order = encoder->protected_->max_lpc_order;
1619                                 if(max_lpc_order > 0) {
1620                                         encoder->private_->local_lpc_compute_autocorrelation(real_signal, frame_header->blocksize, max_lpc_order+1, autoc);
1621                                         /* if autoc[0] == 0.0, the signal is constant and we usually won't get here, but it can happen */
1622                                         if(autoc[0] != 0.0) {
1623                                                 FLAC__lpc_compute_lp_coefficients(autoc, max_lpc_order, encoder->private_->lp_coeff, lpc_error);
1624                                                 if(encoder->protected_->do_exhaustive_model_search) {
1625                                                         min_lpc_order = 1;
1626                                                 }
1627                                                 else {
1628                                                         unsigned guess_lpc_order = FLAC__lpc_compute_best_order(lpc_error, max_lpc_order, frame_header->blocksize, subframe_bps);
1629                                                         min_lpc_order = max_lpc_order = guess_lpc_order;
1630                                                 }
1631                                                 if(encoder->protected_->do_qlp_coeff_prec_search) {
1632                                                         min_qlp_coeff_precision = FLAC__MIN_QLP_COEFF_PRECISION;
1633                                                         max_qlp_coeff_precision = min(8*sizeof(FLAC__int32) - subframe_bps - 1 - 2, (1u<<FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN)-1); /* -2 to keep things 32-bit safe */
1634                                                 }
1635                                                 else {
1636                                                         min_qlp_coeff_precision = max_qlp_coeff_precision = encoder->protected_->qlp_coeff_precision;
1637                                                 }
1638                                                 for(lpc_order = min_lpc_order; lpc_order <= max_lpc_order; lpc_order++) {
1639                                                         lpc_residual_bits_per_sample = FLAC__lpc_compute_expected_bits_per_residual_sample(lpc_error[lpc_order-1], frame_header->blocksize-lpc_order);
1640                                                         if(lpc_residual_bits_per_sample >= (FLAC__real)subframe_bps)
1641                                                                 continue; /* don't even try */
1642                                                         rice_parameter = (lpc_residual_bits_per_sample > 0.0)? (unsigned)(lpc_residual_bits_per_sample+0.5) : 0; /* 0.5 is for rounding */
1643 #ifndef FLAC__SYMMETRIC_RICE
1644                                                         rice_parameter++; /* to account for the signed->unsigned conversion during rice coding */
1645 #endif
1646                                                         if(rice_parameter >= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER) {
1647 #ifdef DEBUG_VERBOSE
1648                                                                 fprintf(stderr, "clipping rice_parameter (%u -> %u) @1\n", rice_parameter, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1);
1649 #endif
1650                                                                 rice_parameter = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1;
1651                                                         }
1652                                                         for(qlp_coeff_precision = min_qlp_coeff_precision; qlp_coeff_precision <= max_qlp_coeff_precision; qlp_coeff_precision++) {
1653                                                                 _candidate_bits = evaluate_lpc_subframe_(encoder, integer_signal, residual[!_best_subframe], encoder->private_->abs_residual, encoder->private_->abs_residual_partition_sums, encoder->private_->raw_bits_per_partition, encoder->private_->lp_coeff[lpc_order-1], frame_header->blocksize, subframe_bps, lpc_order, qlp_coeff_precision, rice_parameter, min_partition_order, max_partition_order, precompute_partition_sums, encoder->protected_->do_escape_coding, encoder->protected_->rice_parameter_search_dist, subframe[!_best_subframe]);
1654                                                                 if(_candidate_bits > 0) { /* if == 0, there was a problem quantizing the lpcoeffs */
1655                                                                         if(_candidate_bits < _best_bits) {
1656                                                                                 _best_subframe = !_best_subframe;
1657                                                                                 _best_bits = _candidate_bits;
1658                                                                         }
1659                                                                 }
1660                                                         }
1661                                                 }
1662                                         }
1663                                 }
1664                         }
1665                 }
1666         }
1667
1668         *best_subframe = _best_subframe;
1669         *best_bits = _best_bits;
1670
1671         return true;
1672 }
1673
1674 FLAC__bool add_subframe_(FLAC__StreamEncoder *encoder, const FLAC__FrameHeader *frame_header, unsigned subframe_bps, const FLAC__Subframe *subframe, FLAC__BitBuffer *frame)
1675 {
1676         switch(subframe->type) {
1677                 case FLAC__SUBFRAME_TYPE_CONSTANT:
1678                         if(!FLAC__subframe_add_constant(&(subframe->data.constant), subframe_bps, subframe->wasted_bits, frame)) {
1679                                 encoder->protected_->state = FLAC__STREAM_ENCODER_FATAL_ERROR_WHILE_ENCODING;
1680                                 return false;
1681                         }
1682                         break;
1683                 case FLAC__SUBFRAME_TYPE_FIXED:
1684                         if(!FLAC__subframe_add_fixed(&(subframe->data.fixed), frame_header->blocksize - subframe->data.fixed.order, subframe_bps, subframe->wasted_bits, frame)) {
1685                                 encoder->protected_->state = FLAC__STREAM_ENCODER_FATAL_ERROR_WHILE_ENCODING;
1686                                 return false;
1687                         }
1688                         break;
1689                 case FLAC__SUBFRAME_TYPE_LPC:
1690                         if(!FLAC__subframe_add_lpc(&(subframe->data.lpc), frame_header->blocksize - subframe->data.lpc.order, subframe_bps, subframe->wasted_bits, frame)) {
1691                                 encoder->protected_->state = FLAC__STREAM_ENCODER_FATAL_ERROR_WHILE_ENCODING;
1692                                 return false;
1693                         }
1694                         break;
1695                 case FLAC__SUBFRAME_TYPE_VERBATIM:
1696                         if(!FLAC__subframe_add_verbatim(&(subframe->data.verbatim), frame_header->blocksize, subframe_bps, subframe->wasted_bits, frame)) {
1697                                 encoder->protected_->state = FLAC__STREAM_ENCODER_FATAL_ERROR_WHILE_ENCODING;
1698                                 return false;
1699                         }
1700                         break;
1701                 default:
1702                         FLAC__ASSERT(0);
1703         }
1704
1705         return true;
1706 }
1707
1708 unsigned evaluate_constant_subframe_(const FLAC__int32 signal, unsigned subframe_bps, FLAC__Subframe *subframe)
1709 {
1710         subframe->type = FLAC__SUBFRAME_TYPE_CONSTANT;
1711         subframe->data.constant.value = signal;
1712
1713         return FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + subframe_bps;
1714 }
1715
1716 unsigned evaluate_fixed_subframe_(FLAC__StreamEncoder *encoder, const FLAC__int32 signal[], FLAC__int32 residual[], FLAC__uint32 abs_residual[], FLAC__uint64 abs_residual_partition_sums[], unsigned raw_bits_per_partition[], unsigned blocksize, unsigned subframe_bps, unsigned order, unsigned rice_parameter, unsigned min_partition_order, unsigned max_partition_order, FLAC__bool precompute_partition_sums, FLAC__bool do_escape_coding, unsigned rice_parameter_search_dist, FLAC__Subframe *subframe)
1717 {
1718         unsigned i, residual_bits;
1719         const unsigned residual_samples = blocksize - order;
1720
1721         FLAC__fixed_compute_residual(signal+order, residual_samples, order, residual);
1722
1723         subframe->type = FLAC__SUBFRAME_TYPE_FIXED;
1724
1725         subframe->data.fixed.entropy_coding_method.type = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE;
1726         subframe->data.fixed.residual = residual;
1727
1728         residual_bits = find_best_partition_order_(encoder->private_, residual, abs_residual, abs_residual_partition_sums, raw_bits_per_partition, residual_samples, order, rice_parameter, min_partition_order, max_partition_order, precompute_partition_sums, do_escape_coding, rice_parameter_search_dist, &subframe->data.fixed.entropy_coding_method.data.partitioned_rice.order, subframe->data.fixed.entropy_coding_method.data.partitioned_rice.parameters, subframe->data.fixed.entropy_coding_method.data.partitioned_rice.raw_bits);
1729
1730         subframe->data.fixed.order = order;
1731         for(i = 0; i < order; i++)
1732                 subframe->data.fixed.warmup[i] = signal[i];
1733
1734         return FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + (order * subframe_bps) + residual_bits;
1735 }
1736
1737 unsigned evaluate_lpc_subframe_(FLAC__StreamEncoder *encoder, const FLAC__int32 signal[], FLAC__int32 residual[], FLAC__uint32 abs_residual[], FLAC__uint64 abs_residual_partition_sums[], unsigned raw_bits_per_partition[], const FLAC__real lp_coeff[], unsigned blocksize, unsigned subframe_bps, unsigned order, unsigned qlp_coeff_precision, unsigned rice_parameter, unsigned min_partition_order, unsigned max_partition_order, FLAC__bool precompute_partition_sums, FLAC__bool do_escape_coding, unsigned rice_parameter_search_dist, FLAC__Subframe *subframe)
1738 {
1739         FLAC__int32 qlp_coeff[FLAC__MAX_LPC_ORDER];
1740         unsigned i, residual_bits;
1741         int quantization, ret;
1742         const unsigned residual_samples = blocksize - order;
1743
1744         ret = FLAC__lpc_quantize_coefficients(lp_coeff, order, qlp_coeff_precision, subframe_bps, qlp_coeff, &quantization);
1745         if(ret != 0)
1746                 return 0; /* this is a hack to indicate to the caller that we can't do lp at this order on this subframe */
1747
1748         if(subframe_bps <= 16 && qlp_coeff_precision <= 16)
1749                 encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit(signal+order, residual_samples, qlp_coeff, order, quantization, residual);
1750         else
1751                 encoder->private_->local_lpc_compute_residual_from_qlp_coefficients(signal+order, residual_samples, qlp_coeff, order, quantization, residual);
1752
1753         subframe->type = FLAC__SUBFRAME_TYPE_LPC;
1754
1755         subframe->data.lpc.entropy_coding_method.type = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE;
1756         subframe->data.lpc.residual = residual;
1757
1758         residual_bits = find_best_partition_order_(encoder->private_, residual, abs_residual, abs_residual_partition_sums, raw_bits_per_partition, residual_samples, order, rice_parameter, min_partition_order, max_partition_order, precompute_partition_sums, do_escape_coding, rice_parameter_search_dist, &subframe->data.lpc.entropy_coding_method.data.partitioned_rice.order, subframe->data.lpc.entropy_coding_method.data.partitioned_rice.parameters, subframe->data.lpc.entropy_coding_method.data.partitioned_rice.raw_bits);
1759
1760         subframe->data.lpc.order = order;
1761         subframe->data.lpc.qlp_coeff_precision = qlp_coeff_precision;
1762         subframe->data.lpc.quantization_level = quantization;
1763         memcpy(subframe->data.lpc.qlp_coeff, qlp_coeff, sizeof(FLAC__int32)*FLAC__MAX_LPC_ORDER);
1764         for(i = 0; i < order; i++)
1765                 subframe->data.lpc.warmup[i] = signal[i];
1766
1767         return FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN + FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN + (order * (qlp_coeff_precision + subframe_bps)) + residual_bits;
1768 }
1769
1770 unsigned evaluate_verbatim_subframe_(const FLAC__int32 signal[], unsigned blocksize, unsigned subframe_bps, FLAC__Subframe *subframe)
1771 {
1772         subframe->type = FLAC__SUBFRAME_TYPE_VERBATIM;
1773
1774         subframe->data.verbatim.data = signal;
1775
1776         return FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + (blocksize * subframe_bps);
1777 }
1778
1779 unsigned find_best_partition_order_(FLAC__StreamEncoderPrivate *private_, const FLAC__int32 residual[], FLAC__uint32 abs_residual[], FLAC__uint64 abs_residual_partition_sums[], unsigned raw_bits_per_partition[], unsigned residual_samples, unsigned predictor_order, unsigned rice_parameter, unsigned min_partition_order, unsigned max_partition_order, FLAC__bool precompute_partition_sums, FLAC__bool do_escape_coding, unsigned rice_parameter_search_dist, unsigned *best_partition_order, unsigned best_parameters[], unsigned best_raw_bits[])
1780 {
1781         FLAC__int32 r;
1782         unsigned residual_bits, best_residual_bits = 0;
1783         unsigned residual_sample;
1784         unsigned best_parameters_index = 0;
1785         const unsigned blocksize = residual_samples + predictor_order;
1786
1787         /* compute abs(residual) for use later */
1788         for(residual_sample = 0; residual_sample < residual_samples; residual_sample++) {
1789                 r = residual[residual_sample];
1790                 abs_residual[residual_sample] = (FLAC__uint32)(r<0? -r : r);
1791         }
1792
1793         while(max_partition_order > 0 && blocksize >> max_partition_order <= predictor_order)
1794                 max_partition_order--;
1795         FLAC__ASSERT(blocksize >> max_partition_order > predictor_order);
1796         min_partition_order = min(min_partition_order, max_partition_order);
1797
1798         if(precompute_partition_sums) {
1799                 int partition_order;
1800                 unsigned sum;
1801
1802                 precompute_partition_info_sums_(abs_residual, abs_residual_partition_sums, residual_samples, predictor_order, min_partition_order, max_partition_order);
1803
1804                 if(do_escape_coding)
1805                         precompute_partition_info_escapes_(residual, raw_bits_per_partition, residual_samples, predictor_order, min_partition_order, max_partition_order);
1806
1807                 for(partition_order = (int)max_partition_order, sum = 0; partition_order >= (int)min_partition_order; partition_order--) {
1808 #ifdef DONT_ESTIMATE_RICE_BITS
1809                         if(!set_partitioned_rice_with_precompute_(residual, abs_residual_partition_sums+sum, raw_bits_per_partition+sum, residual_samples, predictor_order, rice_parameter, rice_parameter_search_dist, (unsigned)partition_order, do_escape_coding, private_->parameters[!best_parameters_index], private_->raw_bits[!best_parameters_index], &residual_bits))
1810 #else
1811                         if(!set_partitioned_rice_with_precompute_(abs_residual, abs_residual_partition_sums+sum, raw_bits_per_partition+sum, residual_samples, predictor_order, rice_parameter, rice_parameter_search_dist, (unsigned)partition_order, do_escape_coding, private_->parameters[!best_parameters_index], private_->raw_bits[!best_parameters_index], &residual_bits))
1812 #endif
1813                         {
1814                                 FLAC__ASSERT(best_residual_bits != 0);
1815                                 break;
1816                         }
1817                         sum += 1u << partition_order;
1818                         if(best_residual_bits == 0 || residual_bits < best_residual_bits) {
1819                                 best_residual_bits = residual_bits;
1820                                 *best_partition_order = partition_order;
1821                                 best_parameters_index = !best_parameters_index;
1822                         }
1823                 }
1824         }
1825         else {
1826                 unsigned partition_order;
1827                 for(partition_order = min_partition_order; partition_order <= max_partition_order; partition_order++) {
1828 #ifdef DONT_ESTIMATE_RICE_BITS
1829                         if(!set_partitioned_rice_(abs_residual, residual, residual_samples, predictor_order, rice_parameter, rice_parameter_search_dist, partition_order, private_->parameters[!best_parameters_index], &residual_bits))
1830 #else
1831                         if(!set_partitioned_rice_(abs_residual, residual_samples, predictor_order, rice_parameter, rice_parameter_search_dist, partition_order, private_->parameters[!best_parameters_index], &residual_bits))
1832 #endif
1833                         {
1834                                 FLAC__ASSERT(best_residual_bits != 0);
1835                                 break;
1836                         }
1837                         if(best_residual_bits == 0 || residual_bits < best_residual_bits) {
1838                                 best_residual_bits = residual_bits;
1839                                 *best_partition_order = partition_order;
1840                                 best_parameters_index = !best_parameters_index;
1841                         }
1842                 }
1843         }
1844
1845         memcpy(best_parameters, private_->parameters[best_parameters_index], sizeof(unsigned)*(1<<(*best_partition_order)));
1846         memcpy(best_raw_bits, private_->raw_bits[best_parameters_index], sizeof(unsigned)*(1<<(*best_partition_order)));
1847
1848         return best_residual_bits;
1849 }
1850
1851 void precompute_partition_info_sums_(const FLAC__uint32 abs_residual[], FLAC__uint64 abs_residual_partition_sums[], unsigned residual_samples, unsigned predictor_order, unsigned min_partition_order, unsigned max_partition_order)
1852 {
1853         int partition_order;
1854         unsigned from_partition, to_partition = 0;
1855         const unsigned blocksize = residual_samples + predictor_order;
1856
1857         /* first do max_partition_order */
1858         for(partition_order = (int)max_partition_order; partition_order >= 0; partition_order--) {
1859                 FLAC__uint64 abs_residual_partition_sum;
1860                 FLAC__uint32 abs_r;
1861                 unsigned partition, partition_sample, partition_samples, residual_sample;
1862                 const unsigned partitions = 1u << partition_order;
1863                 const unsigned default_partition_samples = blocksize >> partition_order;
1864
1865                 FLAC__ASSERT(default_partition_samples > predictor_order);
1866
1867                 for(partition = residual_sample = 0; partition < partitions; partition++) {
1868                         partition_samples = default_partition_samples;
1869                         if(partition == 0)
1870                                 partition_samples -= predictor_order;
1871                         abs_residual_partition_sum = 0;
1872                         for(partition_sample = 0; partition_sample < partition_samples; partition_sample++) {
1873                                 abs_r = abs_residual[residual_sample];
1874                                 abs_residual_partition_sum += abs_r;
1875                                 residual_sample++;
1876                         }
1877                         abs_residual_partition_sums[partition] = abs_residual_partition_sum;
1878                 }
1879                 to_partition = partitions;
1880                 break;
1881         }
1882
1883         /* now merge partitions for lower orders */
1884         for(from_partition = 0, --partition_order; partition_order >= (int)min_partition_order; partition_order--) {
1885                 FLAC__uint64 s;
1886                 unsigned i;
1887                 const unsigned partitions = 1u << partition_order;
1888                 for(i = 0; i < partitions; i++) {
1889                         s = abs_residual_partition_sums[from_partition];
1890                         from_partition++;
1891                         abs_residual_partition_sums[to_partition] = s + abs_residual_partition_sums[from_partition];
1892                         from_partition++;
1893                         to_partition++;
1894                 }
1895         }
1896 }
1897
1898 void precompute_partition_info_escapes_(const FLAC__int32 residual[], unsigned raw_bits_per_partition[], unsigned residual_samples, unsigned predictor_order, unsigned min_partition_order, unsigned max_partition_order)
1899 {
1900         int partition_order;
1901         unsigned from_partition, to_partition = 0;
1902         const unsigned blocksize = residual_samples + predictor_order;
1903
1904         /* first do max_partition_order */
1905         for(partition_order = (int)max_partition_order; partition_order >= 0; partition_order--) {
1906                 FLAC__int32 r, residual_partition_min, residual_partition_max;
1907                 unsigned silog2_min, silog2_max;
1908                 unsigned partition, partition_sample, partition_samples, residual_sample;
1909                 const unsigned partitions = 1u << partition_order;
1910                 const unsigned default_partition_samples = blocksize >> partition_order;
1911
1912                 FLAC__ASSERT(default_partition_samples > predictor_order);
1913
1914                 for(partition = residual_sample = 0; partition < partitions; partition++) {
1915                         partition_samples = default_partition_samples;
1916                         if(partition == 0)
1917                                 partition_samples -= predictor_order;
1918                         residual_partition_min = residual_partition_max = 0;
1919                         for(partition_sample = 0; partition_sample < partition_samples; partition_sample++) {
1920                                 r = residual[residual_sample];
1921                                 if(r < residual_partition_min)
1922                                         residual_partition_min = r;
1923                                 else if(r > residual_partition_max)
1924                                         residual_partition_max = r;
1925                                 residual_sample++;
1926                         }
1927                         silog2_min = FLAC__bitmath_silog2(residual_partition_min);
1928                         silog2_max = FLAC__bitmath_silog2(residual_partition_max);
1929                         raw_bits_per_partition[partition] = max(silog2_min, silog2_max);
1930                 }
1931                 to_partition = partitions;
1932                 break;
1933         }
1934
1935         /* now merge partitions for lower orders */
1936         for(from_partition = 0, --partition_order; partition_order >= (int)min_partition_order; partition_order--) {
1937                 unsigned m;
1938                 unsigned i;
1939                 const unsigned partitions = 1u << partition_order;
1940                 for(i = 0; i < partitions; i++) {
1941                         m = raw_bits_per_partition[from_partition];
1942                         from_partition++;
1943                         raw_bits_per_partition[to_partition] = max(m, raw_bits_per_partition[from_partition]);
1944                         from_partition++;
1945                         to_partition++;
1946                 }
1947         }
1948 }
1949
1950 #ifdef VARIABLE_RICE_BITS
1951 #undef VARIABLE_RICE_BITS
1952 #endif
1953 #ifndef DONT_ESTIMATE_RICE_BITS
1954 #define VARIABLE_RICE_BITS(value, parameter) ((value) >> (parameter))
1955 #endif
1956
1957 #ifdef DONT_ESTIMATE_RICE_BITS
1958 FLAC__bool set_partitioned_rice_(const FLAC__uint32 abs_residual[], const FLAC__int32 residual[], const unsigned residual_samples, const unsigned predictor_order, const unsigned suggested_rice_parameter, const unsigned rice_parameter_search_dist, const unsigned partition_order, unsigned parameters[], unsigned *bits)
1959 #else
1960 FLAC__bool set_partitioned_rice_(const FLAC__uint32 abs_residual[], const unsigned residual_samples, const unsigned predictor_order, const unsigned suggested_rice_parameter, const unsigned rice_parameter_search_dist, const unsigned partition_order, unsigned parameters[], unsigned *bits)
1961 #endif
1962 {
1963         unsigned rice_parameter, partition_bits;
1964 #ifndef NO_RICE_SEARCH
1965         unsigned best_partition_bits;
1966         unsigned min_rice_parameter, max_rice_parameter, best_rice_parameter = 0;
1967 #endif
1968         unsigned bits_ = FLAC__ENTROPY_CODING_METHOD_TYPE_LEN + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN;
1969
1970         FLAC__ASSERT(suggested_rice_parameter < FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER);
1971
1972         if(partition_order == 0) {
1973                 unsigned i;
1974
1975 #ifndef NO_RICE_SEARCH
1976                 if(rice_parameter_search_dist) {
1977                         if(suggested_rice_parameter < rice_parameter_search_dist)
1978                                 min_rice_parameter = 0;
1979                         else
1980                                 min_rice_parameter = suggested_rice_parameter - rice_parameter_search_dist;
1981                         max_rice_parameter = suggested_rice_parameter + rice_parameter_search_dist;
1982                         if(max_rice_parameter >= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER) {
1983 #ifdef DEBUG_VERBOSE
1984                                 fprintf(stderr, "clipping rice_parameter (%u -> %u) @2\n", max_rice_parameter, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1);
1985 #endif
1986                                 max_rice_parameter = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1;
1987                         }
1988                 }
1989                 else
1990                         min_rice_parameter = max_rice_parameter = suggested_rice_parameter;
1991
1992                 best_partition_bits = 0xffffffff;
1993                 for(rice_parameter = min_rice_parameter; rice_parameter <= max_rice_parameter; rice_parameter++) {
1994 #endif
1995 #ifdef VARIABLE_RICE_BITS
1996 #ifdef FLAC__SYMMETRIC_RICE
1997                         partition_bits = (2+rice_parameter) * residual_samples;
1998 #else
1999                         const unsigned rice_parameter_estimate = rice_parameter-1;
2000                         partition_bits = (1+rice_parameter) * residual_samples;
2001 #endif
2002 #else
2003                         partition_bits = 0;
2004 #endif
2005                         partition_bits += FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN;
2006                         for(i = 0; i < residual_samples; i++) {
2007 #ifdef VARIABLE_RICE_BITS
2008 #ifdef FLAC__SYMMETRIC_RICE
2009                                 partition_bits += VARIABLE_RICE_BITS(abs_residual[i], rice_parameter);
2010 #else
2011                                 partition_bits += VARIABLE_RICE_BITS(abs_residual[i], rice_parameter_estimate);
2012 #endif
2013 #else
2014                                 partition_bits += FLAC__bitbuffer_rice_bits(residual[i], rice_parameter); /* NOTE: we will need to pass in residual[] in addition to abs_residual[] */
2015 #endif
2016                         }
2017 #ifndef NO_RICE_SEARCH
2018                         if(partition_bits < best_partition_bits) {
2019                                 best_rice_parameter = rice_parameter;
2020                                 best_partition_bits = partition_bits;
2021                         }
2022                 }
2023 #endif
2024                 parameters[0] = best_rice_parameter;
2025                 bits_ += best_partition_bits;
2026         }
2027         else {
2028                 unsigned partition, residual_sample, save_residual_sample, partition_sample;
2029                 unsigned partition_samples;
2030                 FLAC__uint64 mean, k;
2031                 const unsigned partitions = 1u << partition_order;
2032                 for(partition = residual_sample = 0; partition < partitions; partition++) {
2033                         partition_samples = (residual_samples+predictor_order) >> partition_order;
2034                         if(partition == 0) {
2035                                 if(partition_samples <= predictor_order)
2036                                         return false;
2037                                 else
2038                                         partition_samples -= predictor_order;
2039                         }
2040                         mean = 0;
2041                         save_residual_sample = residual_sample;
2042                         for(partition_sample = 0; partition_sample < partition_samples; residual_sample++, partition_sample++)
2043                                 mean += abs_residual[residual_sample];
2044                         residual_sample = save_residual_sample;
2045 #ifdef FLAC__SYMMETRIC_RICE
2046                         mean += partition_samples >> 1; /* for rounding effect */
2047                         mean /= partition_samples;
2048
2049                         /* calc rice_parameter = floor(log2(mean)) */
2050                         rice_parameter = 0;
2051                         mean>>=1;
2052                         while(mean) {
2053                                 rice_parameter++;
2054                                 mean >>= 1;
2055                         }
2056 #else
2057                         /* calc rice_parameter ala LOCO-I */
2058                         for(rice_parameter = 0, k = partition_samples; k < mean; rice_parameter++, k <<= 1)
2059                                 ;
2060 #endif
2061                         if(rice_parameter >= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER) {
2062 #ifdef DEBUG_VERBOSE
2063                                 fprintf(stderr, "clipping rice_parameter (%u -> %u) @3\n", rice_parameter, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1);
2064 #endif
2065                                 rice_parameter = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1;
2066                         }
2067
2068 #ifndef NO_RICE_SEARCH
2069                         if(rice_parameter_search_dist) {
2070                                 if(rice_parameter < rice_parameter_search_dist)
2071                                         min_rice_parameter = 0;
2072                                 else
2073                                         min_rice_parameter = rice_parameter - rice_parameter_search_dist;
2074                                 max_rice_parameter = rice_parameter + rice_parameter_search_dist;
2075                                 if(max_rice_parameter >= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER) {
2076 #ifdef DEBUG_VERBOSE
2077                                         fprintf(stderr, "clipping rice_parameter (%u -> %u) @4\n", max_rice_parameter, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1);
2078 #endif
2079                                         max_rice_parameter = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1;
2080                                 }
2081                         }
2082                         else
2083                                 min_rice_parameter = max_rice_parameter = rice_parameter;
2084
2085                         best_partition_bits = 0xffffffff;
2086                         for(rice_parameter = min_rice_parameter; rice_parameter <= max_rice_parameter; rice_parameter++) {
2087 #endif
2088 #ifdef VARIABLE_RICE_BITS
2089 #ifdef FLAC__SYMMETRIC_RICE
2090                                 partition_bits = (2+rice_parameter) * partition_samples;
2091 #else
2092                                 const unsigned rice_parameter_estimate = rice_parameter-1;
2093                                 partition_bits = (1+rice_parameter) * partition_samples;
2094 #endif
2095 #else
2096                                 partition_bits = 0;
2097 #endif
2098                                 partition_bits += FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN;
2099                                 save_residual_sample = residual_sample;
2100                                 for(partition_sample = 0; partition_sample < partition_samples; residual_sample++, partition_sample++) {
2101 #ifdef VARIABLE_RICE_BITS
2102 #ifdef FLAC__SYMMETRIC_RICE
2103                                         partition_bits += VARIABLE_RICE_BITS(abs_residual[residual_sample], rice_parameter);
2104 #else
2105                                         partition_bits += VARIABLE_RICE_BITS(abs_residual[residual_sample], rice_parameter_estimate);
2106 #endif
2107 #else
2108                                         partition_bits += FLAC__bitbuffer_rice_bits(residual[residual_sample], rice_parameter); /* NOTE: we will need to pass in residual[] in addition to abs_residual[] */
2109 #endif
2110                                 }
2111 #ifndef NO_RICE_SEARCH
2112                                 if(rice_parameter != max_rice_parameter)
2113                                         residual_sample = save_residual_sample;
2114                                 if(partition_bits < best_partition_bits) {
2115                                         best_rice_parameter = rice_parameter;
2116                                         best_partition_bits = partition_bits;
2117                                 }
2118                         }
2119 #endif
2120                         parameters[partition] = best_rice_parameter;
2121                         bits_ += best_partition_bits;
2122                 }
2123         }
2124
2125         *bits = bits_;
2126         return true;
2127 }
2128
2129 #ifdef DONT_ESTIMATE_RICE_BITS
2130 FLAC__bool set_partitioned_rice_with_precompute_(const FLAC__int32 residual[], const FLAC__uint64 abs_residual_partition_sums[], const unsigned raw_bits_per_partition[], const unsigned residual_samples, const unsigned predictor_order, const unsigned suggested_rice_parameter, const unsigned rice_parameter_search_dist, const unsigned partition_order, const FLAC__bool search_for_escapes, unsigned parameters[], unsigned raw_bits[], unsigned *bits)
2131 #else
2132 FLAC__bool set_partitioned_rice_with_precompute_(const FLAC__uint32 abs_residual[], const FLAC__uint64 abs_residual_partition_sums[], const unsigned raw_bits_per_partition[], const unsigned residual_samples, const unsigned predictor_order, const unsigned suggested_rice_parameter, const unsigned rice_parameter_search_dist, const unsigned partition_order, const FLAC__bool search_for_escapes, unsigned parameters[], unsigned raw_bits[], unsigned *bits)
2133 #endif
2134 {
2135         unsigned rice_parameter, partition_bits;
2136 #ifndef NO_RICE_SEARCH
2137         unsigned best_partition_bits;
2138         unsigned min_rice_parameter, max_rice_parameter, best_rice_parameter = 0;
2139 #endif
2140         unsigned flat_bits;
2141         unsigned bits_ = FLAC__ENTROPY_CODING_METHOD_TYPE_LEN + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN;
2142
2143         FLAC__ASSERT(suggested_rice_parameter < FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER);
2144
2145         if(partition_order == 0) {
2146                 unsigned i;
2147
2148 #ifndef NO_RICE_SEARCH
2149                 if(rice_parameter_search_dist) {
2150                         if(suggested_rice_parameter < rice_parameter_search_dist)
2151                                 min_rice_parameter = 0;
2152                         else
2153                                 min_rice_parameter = suggested_rice_parameter - rice_parameter_search_dist;
2154                         max_rice_parameter = suggested_rice_parameter + rice_parameter_search_dist;
2155                         if(max_rice_parameter >= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER) {
2156 #ifdef DEBUG_VERBOSE
2157                                 fprintf(stderr, "clipping rice_parameter (%u -> %u) @5\n", max_rice_parameter, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1);
2158 #endif
2159                                 max_rice_parameter = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1;
2160                         }
2161                 }
2162                 else
2163                         min_rice_parameter = max_rice_parameter = suggested_rice_parameter;
2164
2165                 best_partition_bits = 0xffffffff;
2166                 for(rice_parameter = min_rice_parameter; rice_parameter <= max_rice_parameter; rice_parameter++) {
2167 #endif
2168 #ifdef VARIABLE_RICE_BITS
2169 #ifdef FLAC__SYMMETRIC_RICE
2170                         partition_bits = (2+rice_parameter) * residual_samples;
2171 #else
2172                         const unsigned rice_parameter_estimate = rice_parameter-1;
2173                         partition_bits = (1+rice_parameter) * residual_samples;
2174 #endif
2175 #else
2176                         partition_bits = 0;
2177 #endif
2178                         partition_bits += FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN;
2179                         for(i = 0; i < residual_samples; i++) {
2180 #ifdef VARIABLE_RICE_BITS
2181 #ifdef FLAC__SYMMETRIC_RICE
2182                                 partition_bits += VARIABLE_RICE_BITS(abs_residual[i], rice_parameter);
2183 #else
2184                                 partition_bits += VARIABLE_RICE_BITS(abs_residual[i], rice_parameter_estimate);
2185 #endif
2186 #else
2187                                 partition_bits += FLAC__bitbuffer_rice_bits(residual[i], rice_parameter); /* NOTE: we will need to pass in residual[] instead of abs_residual[] */
2188 #endif
2189                         }
2190 #ifndef NO_RICE_SEARCH
2191                         if(partition_bits < best_partition_bits) {
2192                                 best_rice_parameter = rice_parameter;
2193                                 best_partition_bits = partition_bits;
2194                         }
2195                 }
2196 #endif
2197                 if(search_for_escapes) {
2198                         flat_bits = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN + raw_bits_per_partition[0] * residual_samples;
2199                         if(flat_bits <= best_partition_bits) {
2200                                 raw_bits[0] = raw_bits_per_partition[0];
2201                                 best_rice_parameter = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER;
2202                                 best_partition_bits = flat_bits;
2203                         }
2204                 }
2205                 parameters[0] = best_rice_parameter;
2206                 bits_ += best_partition_bits;
2207         }
2208         else {
2209                 unsigned partition, residual_sample, save_residual_sample, partition_sample;
2210                 unsigned partition_samples;
2211                 FLAC__uint64 mean, k;
2212                 const unsigned partitions = 1u << partition_order;
2213                 for(partition = residual_sample = 0; partition < partitions; partition++) {
2214                         partition_samples = (residual_samples+predictor_order) >> partition_order;
2215                         if(partition == 0) {
2216                                 if(partition_samples <= predictor_order)
2217                                         return false;
2218                                 else
2219                                         partition_samples -= predictor_order;
2220                         }
2221                         mean = abs_residual_partition_sums[partition];
2222 #ifdef FLAC__SYMMETRIC_RICE
2223                         mean += partition_samples >> 1; /* for rounding effect */
2224                         mean /= partition_samples;
2225
2226                         /* calc rice_parameter = floor(log2(mean)) */
2227                         rice_parameter = 0;
2228                         mean>>=1;
2229                         while(mean) {
2230                                 rice_parameter++;
2231                                 mean >>= 1;
2232                         }
2233 #else
2234                         /* calc rice_parameter ala LOCO-I */
2235                         for(rice_parameter = 0, k = partition_samples; k < mean; rice_parameter++, k <<= 1)
2236                                 ;
2237 #endif
2238                         if(rice_parameter >= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER) {
2239 #ifdef DEBUG_VERBOSE
2240                                 fprintf(stderr, "clipping rice_parameter (%u -> %u) @6\n", rice_parameter, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1);
2241 #endif
2242                                 rice_parameter = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1;
2243                         }
2244
2245 #ifndef NO_RICE_SEARCH
2246                         if(rice_parameter_search_dist) {
2247                                 if(rice_parameter < rice_parameter_search_dist)
2248                                         min_rice_parameter = 0;
2249                                 else
2250                                         min_rice_parameter = rice_parameter - rice_parameter_search_dist;
2251                                 max_rice_parameter = rice_parameter + rice_parameter_search_dist;
2252                                 if(max_rice_parameter >= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER) {
2253 #ifdef DEBUG_VERBOSE
2254                                         fprintf(stderr, "clipping rice_parameter (%u -> %u) @7\n", max_rice_parameter, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1);
2255 #endif
2256                                         max_rice_parameter = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1;
2257                                 }
2258                         }
2259                         else
2260                                 min_rice_parameter = max_rice_parameter = rice_parameter;
2261
2262                         best_partition_bits = 0xffffffff;
2263                         for(rice_parameter = min_rice_parameter; rice_parameter <= max_rice_parameter; rice_parameter++) {
2264 #endif
2265 #ifdef VARIABLE_RICE_BITS
2266 #ifdef FLAC__SYMMETRIC_RICE
2267                                 partition_bits = (2+rice_parameter) * partition_samples;
2268 #else
2269                                 const unsigned rice_parameter_estimate = rice_parameter-1;
2270                                 partition_bits = (1+rice_parameter) * partition_samples;
2271 #endif
2272 #else
2273                                 partition_bits = 0;
2274 #endif
2275                                 partition_bits += FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN;
2276                                 save_residual_sample = residual_sample;
2277                                 for(partition_sample = 0; partition_sample < partition_samples; residual_sample++, partition_sample++) {
2278 #ifdef VARIABLE_RICE_BITS
2279 #ifdef FLAC__SYMMETRIC_RICE
2280                                         partition_bits += VARIABLE_RICE_BITS(abs_residual[residual_sample], rice_parameter);
2281 #else
2282                                         partition_bits += VARIABLE_RICE_BITS(abs_residual[residual_sample], rice_parameter_estimate);
2283 #endif
2284 #else
2285                                         partition_bits += FLAC__bitbuffer_rice_bits(residual[residual_sample], rice_parameter); /* NOTE: we will need to pass in residual[] instead of abs_residual[] */
2286 #endif
2287                                 }
2288 #ifndef NO_RICE_SEARCH
2289                                 if(rice_parameter != max_rice_parameter)
2290                                         residual_sample = save_residual_sample;
2291                                 if(partition_bits < best_partition_bits) {
2292                                         best_rice_parameter = rice_parameter;
2293                                         best_partition_bits = partition_bits;
2294                                 }
2295                         }
2296 #endif
2297                         if(search_for_escapes) {
2298                                 flat_bits = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN + raw_bits_per_partition[partition] * partition_samples;
2299                                 if(flat_bits <= best_partition_bits) {
2300                                         raw_bits[partition] = raw_bits_per_partition[partition];
2301                                         best_rice_parameter = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER;
2302                                         best_partition_bits = flat_bits;
2303                                 }
2304                         }
2305                         parameters[partition] = best_rice_parameter;
2306                         bits_ += best_partition_bits;
2307                 }
2308         }
2309
2310         *bits = bits_;
2311         return true;
2312 }
2313
2314 unsigned get_wasted_bits_(FLAC__int32 signal[], unsigned samples)
2315 {
2316         unsigned i, shift;
2317         FLAC__int32 x = 0;
2318
2319         for(i = 0; i < samples && !(x&1); i++)
2320                 x |= signal[i];
2321
2322         if(x == 0) {
2323                 shift = 0;
2324         }
2325         else {
2326                 for(shift = 0; !(x&1); shift++)
2327                         x >>= 1;
2328         }
2329
2330         if(shift > 0) {
2331                 for(i = 0; i < samples; i++)
2332                          signal[i] >>= shift;
2333         }
2334
2335         return shift;
2336 }
2337
2338 void append_to_verify_fifo_(verify_input_fifo *fifo, const FLAC__int32 * const input[], unsigned input_offset, unsigned channels, unsigned wide_samples)
2339 {
2340         unsigned channel;
2341
2342         for(channel = 0; channel < channels; channel++)
2343                 memcpy(&fifo->data[channel][fifo->tail], &input[channel][input_offset], sizeof(FLAC__int32) * wide_samples);
2344
2345         fifo->tail += wide_samples;
2346
2347         FLAC__ASSERT(fifo->tail <= fifo->size);
2348 }
2349
2350 void append_to_verify_fifo_interleaved_(verify_input_fifo *fifo, const FLAC__int32 input[], unsigned input_offset, unsigned channels, unsigned wide_samples)
2351 {
2352         unsigned channel;
2353         unsigned sample, wide_sample;
2354         unsigned tail = fifo->tail;
2355
2356         sample = input_offset * channels;
2357         for(wide_sample = 0; wide_sample < wide_samples; wide_sample++) {
2358                 for(channel = 0; channel < channels; channel++)
2359                         fifo->data[channel][tail] = input[sample++];
2360                 tail++;
2361         }
2362         fifo->tail = tail;
2363
2364         FLAC__ASSERT(fifo->tail <= fifo->size);
2365 }
2366
2367 FLAC__StreamDecoderReadStatus verify_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data)
2368 {
2369         FLAC__StreamEncoder *encoder = (FLAC__StreamEncoder*)client_data;
2370         const unsigned encoded_bytes = encoder->private_->verify.output.bytes;
2371         (void)decoder;
2372
2373         if(encoder->private_->verify.needs_magic_hack) {
2374                 FLAC__ASSERT(*bytes >= FLAC__STREAM_SYNC_LENGTH);
2375                 *bytes = FLAC__STREAM_SYNC_LENGTH;
2376                 memcpy(buffer, FLAC__STREAM_SYNC_STRING, *bytes);
2377                 encoder->private_->verify.needs_magic_hack = false;
2378         }
2379         else {
2380                 if(encoded_bytes == 0) {
2381                         /*
2382                          * If we get here, a FIFO underflow has occurred,
2383                          * which means there is a bug somewhere.
2384                          */
2385                         FLAC__ASSERT(0);
2386                         return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
2387                 }
2388                 else if(encoded_bytes < *bytes)
2389                         *bytes = encoded_bytes;
2390                 memcpy(buffer, encoder->private_->verify.output.data, *bytes);
2391                 encoder->private_->verify.output.data += *bytes;
2392                 encoder->private_->verify.output.bytes -= *bytes;
2393         }
2394
2395         return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
2396 }
2397
2398 FLAC__StreamDecoderWriteStatus verify_write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
2399 {
2400         FLAC__StreamEncoder *encoder = (FLAC__StreamEncoder *)client_data;
2401         unsigned channel;
2402         const unsigned channels = FLAC__stream_decoder_get_channels(decoder);
2403         const unsigned blocksize = frame->header.blocksize;
2404         const unsigned bytes_per_block = sizeof(FLAC__int32) * blocksize;
2405
2406         for(channel = 0; channel < channels; channel++) {
2407                 if(0 != memcmp(buffer[channel], encoder->private_->verify.input_fifo.data[channel], bytes_per_block)) {
2408                         unsigned i, sample = 0;
2409                         FLAC__int32 expect = 0, got = 0;
2410
2411                         for(i = 0; i < blocksize; i++) {
2412                                 if(buffer[channel][i] != encoder->private_->verify.input_fifo.data[channel][i]) {
2413                                         sample = i;
2414                                         expect = (FLAC__int32)encoder->private_->verify.input_fifo.data[channel][i];
2415                                         got = (FLAC__int32)buffer[channel][i];
2416                                         break;
2417                                 }
2418                         }
2419                         FLAC__ASSERT(i < blocksize);
2420                         FLAC__ASSERT(frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER);
2421                         encoder->private_->verify.error_stats.absolute_sample = frame->header.number.sample_number + sample;
2422                         encoder->private_->verify.error_stats.frame_number = frame->header.number.sample_number / blocksize;
2423                         encoder->private_->verify.error_stats.channel = channel;
2424                         encoder->private_->verify.error_stats.sample = sample;
2425                         encoder->private_->verify.error_stats.expected = expect;
2426                         encoder->private_->verify.error_stats.got = got;
2427                         encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA;
2428                         return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
2429                 }
2430         }
2431         /* dequeue the frame from the fifo */
2432         for(channel = 0; channel < channels; channel++) {
2433                 memmove(&encoder->private_->verify.input_fifo.data[channel][0], &encoder->private_->verify.input_fifo.data[channel][blocksize], encoder->private_->verify.input_fifo.tail - blocksize);
2434         }
2435         encoder->private_->verify.input_fifo.tail -= blocksize;
2436         return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
2437 }
2438
2439 void verify_metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
2440 {
2441         (void)decoder, (void)metadata, (void)client_data;
2442 }
2443
2444 void verify_error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
2445 {
2446         FLAC__StreamEncoder *encoder = (FLAC__StreamEncoder*)client_data;
2447         (void)decoder, (void)status;
2448         encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR;
2449 }