fix typo in comment
[flac.git] / src / libFLAC / stream_encoder.c
1 /* libFLAC - Free Lossless Audio Codec library
2  * Copyright (C) 2000,2001,2002,2003,2004  Josh Coalson
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * - Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *
11  * - Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in the
13  * documentation and/or other materials provided with the distribution.
14  *
15  * - Neither the name of the Xiph.org Foundation nor the names of its
16  * contributors may be used to endorse or promote products derived from
17  * this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22  * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
23  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31
32 #include <limits.h>
33 #include <stdio.h>
34 #include <stdlib.h> /* for malloc() */
35 #include <string.h> /* for memcpy() */
36 #include "FLAC/assert.h"
37 #include "FLAC/stream_decoder.h"
38 #include "protected/stream_encoder.h"
39 #include "private/bitbuffer.h"
40 #include "private/bitmath.h"
41 #include "private/crc.h"
42 #include "private/cpu.h"
43 #include "private/fixed.h"
44 #include "private/format.h"
45 #include "private/lpc.h"
46 #include "private/md5.h"
47 #include "private/memory.h"
48 #include "private/stream_encoder_framing.h"
49
50 #ifdef HAVE_CONFIG_H
51 #include <config.h>
52 #endif
53
54 #ifdef min
55 #undef min
56 #endif
57 #define min(x,y) ((x)<(y)?(x):(y))
58
59 #ifdef max
60 #undef max
61 #endif
62 #define max(x,y) ((x)>(y)?(x):(y))
63
64 typedef struct {
65         FLAC__int32 *data[FLAC__MAX_CHANNELS];
66         unsigned size; /* of each data[] in samples */
67         unsigned tail;
68 } verify_input_fifo;
69
70 typedef struct {
71         const FLAC__byte *data;
72         unsigned capacity;
73         unsigned bytes;
74 } verify_output;
75
76 typedef enum {
77         ENCODER_IN_MAGIC = 0,
78         ENCODER_IN_METADATA = 1,
79         ENCODER_IN_AUDIO = 2
80 } EncoderStateHint;
81
82 /***********************************************************************
83  *
84  * Private class method prototypes
85  *
86  ***********************************************************************/
87
88 static void set_defaults_(FLAC__StreamEncoder *encoder);
89 static void free_(FLAC__StreamEncoder *encoder);
90 static FLAC__bool resize_buffers_(FLAC__StreamEncoder *encoder, unsigned new_size);
91 static FLAC__bool write_bitbuffer_(FLAC__StreamEncoder *encoder, unsigned samples);
92 static FLAC__bool process_frame_(FLAC__StreamEncoder *encoder, FLAC__bool is_last_frame);
93 static FLAC__bool process_subframes_(FLAC__StreamEncoder *encoder, FLAC__bool is_last_frame);
94
95 static FLAC__bool process_subframe_(
96         FLAC__StreamEncoder *encoder,
97         unsigned min_partition_order,
98         unsigned max_partition_order,
99         FLAC__bool precompute_partition_sums,
100         const FLAC__FrameHeader *frame_header,
101         unsigned subframe_bps,
102         const FLAC__int32 integer_signal[],
103 #ifndef FLAC__INTEGER_ONLY_LIBRARY
104         const FLAC__real real_signal[],
105 #endif
106         FLAC__Subframe *subframe[2],
107         FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents[2],
108         FLAC__int32 *residual[2],
109         unsigned *best_subframe,
110         unsigned *best_bits
111 );
112
113 static FLAC__bool add_subframe_(
114         FLAC__StreamEncoder *encoder,
115         const FLAC__FrameHeader *frame_header,
116         unsigned subframe_bps,
117         const FLAC__Subframe *subframe,
118         FLAC__BitBuffer *frame
119 );
120
121 static unsigned evaluate_constant_subframe_(
122         const FLAC__int32 signal,
123         unsigned subframe_bps,
124         FLAC__Subframe *subframe
125 );
126
127 static unsigned evaluate_fixed_subframe_(
128         FLAC__StreamEncoder *encoder,
129         const FLAC__int32 signal[],
130         FLAC__int32 residual[],
131         FLAC__uint32 abs_residual[],
132         FLAC__uint64 abs_residual_partition_sums[],
133         unsigned raw_bits_per_partition[],
134         unsigned blocksize,
135         unsigned subframe_bps,
136         unsigned order,
137         unsigned rice_parameter,
138         unsigned min_partition_order,
139         unsigned max_partition_order,
140         FLAC__bool precompute_partition_sums,
141         FLAC__bool do_escape_coding,
142         unsigned rice_parameter_search_dist,
143         FLAC__Subframe *subframe,
144         FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents
145 );
146
147 #ifndef FLAC__INTEGER_ONLY_LIBRARY
148 static unsigned evaluate_lpc_subframe_(
149         FLAC__StreamEncoder *encoder,
150         const FLAC__int32 signal[],
151         FLAC__int32 residual[],
152         FLAC__uint32 abs_residual[],
153         FLAC__uint64 abs_residual_partition_sums[],
154         unsigned raw_bits_per_partition[],
155         const FLAC__real lp_coeff[],
156         unsigned blocksize,
157         unsigned subframe_bps,
158         unsigned order,
159         unsigned qlp_coeff_precision,
160         unsigned rice_parameter,
161         unsigned min_partition_order,
162         unsigned max_partition_order,
163         FLAC__bool precompute_partition_sums,
164         FLAC__bool do_escape_coding,
165         unsigned rice_parameter_search_dist,
166         FLAC__Subframe *subframe,
167         FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents
168 );
169 #endif
170
171 static unsigned evaluate_verbatim_subframe_(
172         const FLAC__int32 signal[],
173         unsigned blocksize,
174         unsigned subframe_bps,
175         FLAC__Subframe *subframe
176 );
177
178 static unsigned find_best_partition_order_(
179         struct FLAC__StreamEncoderPrivate *private_,
180         const FLAC__int32 residual[],
181         FLAC__uint32 abs_residual[],
182         FLAC__uint64 abs_residual_partition_sums[],
183         unsigned raw_bits_per_partition[],
184         unsigned residual_samples,
185         unsigned predictor_order,
186         unsigned rice_parameter,
187         unsigned min_partition_order,
188         unsigned max_partition_order,
189         FLAC__bool precompute_partition_sums,
190         FLAC__bool do_escape_coding,
191         unsigned rice_parameter_search_dist,
192         FLAC__EntropyCodingMethod_PartitionedRice *best_partitioned_rice
193 );
194
195 static void precompute_partition_info_sums_(
196         const FLAC__uint32 abs_residual[],
197         FLAC__uint64 abs_residual_partition_sums[],
198         unsigned residual_samples,
199         unsigned predictor_order,
200         unsigned min_partition_order,
201         unsigned max_partition_order
202 );
203
204 static void precompute_partition_info_escapes_(
205         const FLAC__int32 residual[],
206         unsigned raw_bits_per_partition[],
207         unsigned residual_samples,
208         unsigned predictor_order,
209         unsigned min_partition_order,
210         unsigned max_partition_order
211 );
212
213 #ifdef DONT_ESTIMATE_RICE_BITS
214 static FLAC__bool set_partitioned_rice_(
215         const FLAC__uint32 abs_residual[],
216         const FLAC__int32 residual[],
217         const unsigned residual_samples,
218         const unsigned predictor_order,
219         const unsigned suggested_rice_parameter,
220         const unsigned rice_parameter_search_dist,
221         const unsigned partition_order,
222         FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents,
223         unsigned *bits
224 );
225
226 static FLAC__bool set_partitioned_rice_with_precompute_(
227         const FLAC__int32 residual[],
228         const FLAC__uint64 abs_residual_partition_sums[],
229         const unsigned raw_bits_per_partition[],
230         const unsigned residual_samples,
231         const unsigned predictor_order,
232         const unsigned suggested_rice_parameter,
233         const unsigned rice_parameter_search_dist,
234         const unsigned partition_order,
235         const FLAC__bool search_for_escapes,
236         FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents,
237         unsigned *bits
238 );
239 #else
240 static FLAC__bool set_partitioned_rice_(
241         const FLAC__uint32 abs_residual[],
242         const unsigned residual_samples,
243         const unsigned predictor_order,
244         const unsigned suggested_rice_parameter,
245         const unsigned rice_parameter_search_dist,
246         const unsigned partition_order,
247         FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents,
248         unsigned *bits
249 );
250
251 static FLAC__bool set_partitioned_rice_with_precompute_(
252         const FLAC__uint32 abs_residual[],
253         const FLAC__uint64 abs_residual_partition_sums[],
254         const unsigned raw_bits_per_partition[],
255         const unsigned residual_samples,
256         const unsigned predictor_order,
257         const unsigned suggested_rice_parameter,
258         const unsigned rice_parameter_search_dist,
259         const unsigned partition_order,
260         const FLAC__bool search_for_escapes,
261         FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents,
262         unsigned *bits
263 );
264 #endif
265
266 static unsigned get_wasted_bits_(FLAC__int32 signal[], unsigned samples);
267
268 /* verify-related routines: */
269 static void append_to_verify_fifo_(
270         verify_input_fifo *fifo,
271         const FLAC__int32 * const input[],
272         unsigned input_offset,
273         unsigned channels,
274         unsigned wide_samples
275 );
276
277 static void append_to_verify_fifo_interleaved_(
278         verify_input_fifo *fifo,
279         const FLAC__int32 input[],
280         unsigned input_offset,
281         unsigned channels,
282         unsigned wide_samples
283 );
284
285 static FLAC__StreamDecoderReadStatus verify_read_callback_(
286         const FLAC__StreamDecoder *decoder,
287         FLAC__byte buffer[],
288         unsigned *bytes,
289         void *client_data
290 );
291
292 static FLAC__StreamDecoderWriteStatus verify_write_callback_(
293         const FLAC__StreamDecoder *decoder,
294         const FLAC__Frame *frame,
295         const FLAC__int32 * const buffer[],
296         void *client_data
297 );
298
299 static void verify_metadata_callback_(
300         const FLAC__StreamDecoder *decoder,
301         const FLAC__StreamMetadata *metadata,
302         void *client_data
303 );
304
305 static void verify_error_callback_(
306         const FLAC__StreamDecoder *decoder,
307         FLAC__StreamDecoderErrorStatus status,
308         void *client_data
309 );
310
311
312 /***********************************************************************
313  *
314  * Private class data
315  *
316  ***********************************************************************/
317
318 typedef struct FLAC__StreamEncoderPrivate {
319         unsigned input_capacity;                          /* current size (in samples) of the signal and residual buffers */
320         FLAC__int32 *integer_signal[FLAC__MAX_CHANNELS];  /* the integer version of the input signal */
321         FLAC__int32 *integer_signal_mid_side[2];          /* the integer version of the mid-side input signal (stereo only) */
322 #ifndef FLAC__INTEGER_ONLY_LIBRARY
323         FLAC__real *real_signal[FLAC__MAX_CHANNELS];      /* the floating-point version of the input signal */
324         FLAC__real *real_signal_mid_side[2];              /* the floating-point version of the mid-side input signal (stereo only) */
325 #endif
326         unsigned subframe_bps[FLAC__MAX_CHANNELS];        /* the effective bits per sample of the input signal (stream bps - wasted bits) */
327         unsigned subframe_bps_mid_side[2];                /* the effective bits per sample of the mid-side input signal (stream bps - wasted bits + 0/1) */
328         FLAC__int32 *residual_workspace[FLAC__MAX_CHANNELS][2]; /* each channel has a candidate and best workspace where the subframe residual signals will be stored */
329         FLAC__int32 *residual_workspace_mid_side[2][2];
330         FLAC__Subframe subframe_workspace[FLAC__MAX_CHANNELS][2];
331         FLAC__Subframe subframe_workspace_mid_side[2][2];
332         FLAC__Subframe *subframe_workspace_ptr[FLAC__MAX_CHANNELS][2];
333         FLAC__Subframe *subframe_workspace_ptr_mid_side[2][2];
334         FLAC__EntropyCodingMethod_PartitionedRiceContents partitioned_rice_contents_workspace[FLAC__MAX_CHANNELS][2];
335         FLAC__EntropyCodingMethod_PartitionedRiceContents partitioned_rice_contents_workspace_mid_side[FLAC__MAX_CHANNELS][2];
336         FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents_workspace_ptr[FLAC__MAX_CHANNELS][2];
337         FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents_workspace_ptr_mid_side[FLAC__MAX_CHANNELS][2];
338         unsigned best_subframe[FLAC__MAX_CHANNELS];       /* index into the above workspaces */
339         unsigned best_subframe_mid_side[2];
340         unsigned best_subframe_bits[FLAC__MAX_CHANNELS];  /* size in bits of the best subframe for each channel */
341         unsigned best_subframe_bits_mid_side[2];
342         FLAC__uint32 *abs_residual;                       /* workspace where abs(candidate residual) is stored */
343         FLAC__uint64 *abs_residual_partition_sums;        /* workspace where the sum of abs(candidate residual) for each partition is stored */
344         unsigned *raw_bits_per_partition;                 /* workspace where the sum of silog2(candidate residual) for each partition is stored */
345         FLAC__BitBuffer *frame;                           /* the current frame being worked on */
346         unsigned loose_mid_side_stereo_frames;            /* rounded number of frames the encoder will use before trying both independent and mid/side frames again */
347         unsigned loose_mid_side_stereo_frame_count;       /* number of frames using the current channel assignment */
348         FLAC__ChannelAssignment last_channel_assignment;
349         FLAC__StreamMetadata metadata;
350         unsigned current_sample_number;
351         unsigned current_frame_number;
352         struct FLAC__MD5Context md5context;
353         FLAC__CPUInfo cpuinfo;
354 #ifndef FLAC__INTEGER_ONLY_LIBRARY
355         unsigned (*local_fixed_compute_best_predictor)(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]);
356 #else
357         unsigned (*local_fixed_compute_best_predictor)(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]);
358 #endif
359 #ifndef FLAC__INTEGER_ONLY_LIBRARY
360         void (*local_lpc_compute_autocorrelation)(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]);
361         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[]);
362         void (*local_lpc_compute_residual_from_qlp_coefficients_64bit)(const FLAC__int32 data[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]);
363         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[]);
364 #endif
365         FLAC__bool use_wide_by_block;          /* use slow 64-bit versions of some functions because of the block size */
366         FLAC__bool use_wide_by_partition;      /* use slow 64-bit versions of some functions because of the min partition order and blocksize */
367         FLAC__bool use_wide_by_order;          /* use slow 64-bit versions of some functions because of the lpc order */
368         FLAC__bool precompute_partition_sums;  /* our initial guess as to whether precomputing the partitions sums will be a speed improvement */
369         FLAC__bool disable_constant_subframes;
370         FLAC__bool disable_fixed_subframes;
371         FLAC__bool disable_verbatim_subframes;
372         FLAC__StreamEncoderWriteCallback write_callback;
373         FLAC__StreamEncoderMetadataCallback metadata_callback;
374         void *client_data;
375         /* unaligned (original) pointers to allocated data */
376         FLAC__int32 *integer_signal_unaligned[FLAC__MAX_CHANNELS];
377         FLAC__int32 *integer_signal_mid_side_unaligned[2];
378 #ifndef FLAC__INTEGER_ONLY_LIBRARY
379         FLAC__real *real_signal_unaligned[FLAC__MAX_CHANNELS];
380         FLAC__real *real_signal_mid_side_unaligned[2];
381 #endif
382         FLAC__int32 *residual_workspace_unaligned[FLAC__MAX_CHANNELS][2];
383         FLAC__int32 *residual_workspace_mid_side_unaligned[2][2];
384         FLAC__uint32 *abs_residual_unaligned;
385         FLAC__uint64 *abs_residual_partition_sums_unaligned;
386         unsigned *raw_bits_per_partition_unaligned;
387         /*
388          * These fields have been moved here from private function local
389          * declarations merely to save stack space during encoding.
390          */
391 #ifndef FLAC__INTEGER_ONLY_LIBRARY
392         FLAC__real lp_coeff[FLAC__MAX_LPC_ORDER][FLAC__MAX_LPC_ORDER]; /* from process_subframe_() */
393 #endif
394         FLAC__EntropyCodingMethod_PartitionedRiceContents partitioned_rice_contents_extra[2]; /* from find_best_partition_order_() */
395         /*
396          * The data for the verify section
397          */
398         struct {
399                 FLAC__StreamDecoder *decoder;
400                 EncoderStateHint state_hint;
401                 FLAC__bool needs_magic_hack;
402                 verify_input_fifo input_fifo;
403                 verify_output output;
404                 struct {
405                         FLAC__uint64 absolute_sample;
406                         unsigned frame_number;
407                         unsigned channel;
408                         unsigned sample;
409                         FLAC__int32 expected;
410                         FLAC__int32 got;
411                 } error_stats;
412         } verify;
413         FLAC__bool is_being_deleted; /* if true, call to ..._finish() from ..._delete() will not call the callbacks */
414 } FLAC__StreamEncoderPrivate;
415
416 /***********************************************************************
417  *
418  * Public static class data
419  *
420  ***********************************************************************/
421
422 FLAC_API const char * const FLAC__StreamEncoderStateString[] = {
423         "FLAC__STREAM_ENCODER_OK",
424         "FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR",
425         "FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA",
426         "FLAC__STREAM_ENCODER_INVALID_CALLBACK",
427         "FLAC__STREAM_ENCODER_INVALID_NUMBER_OF_CHANNELS",
428         "FLAC__STREAM_ENCODER_INVALID_BITS_PER_SAMPLE",
429         "FLAC__STREAM_ENCODER_INVALID_SAMPLE_RATE",
430         "FLAC__STREAM_ENCODER_INVALID_BLOCK_SIZE",
431         "FLAC__STREAM_ENCODER_INVALID_MAX_LPC_ORDER",
432         "FLAC__STREAM_ENCODER_INVALID_QLP_COEFF_PRECISION",
433         "FLAC__STREAM_ENCODER_MID_SIDE_CHANNELS_MISMATCH",
434         "FLAC__STREAM_ENCODER_MID_SIDE_SAMPLE_SIZE_MISMATCH",
435         "FLAC__STREAM_ENCODER_ILLEGAL_MID_SIDE_FORCE",
436         "FLAC__STREAM_ENCODER_BLOCK_SIZE_TOO_SMALL_FOR_LPC_ORDER",
437         "FLAC__STREAM_ENCODER_NOT_STREAMABLE",
438         "FLAC__STREAM_ENCODER_FRAMING_ERROR",
439         "FLAC__STREAM_ENCODER_INVALID_METADATA",
440         "FLAC__STREAM_ENCODER_FATAL_ERROR_WHILE_ENCODING",
441         "FLAC__STREAM_ENCODER_FATAL_ERROR_WHILE_WRITING",
442         "FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR",
443         "FLAC__STREAM_ENCODER_ALREADY_INITIALIZED",
444         "FLAC__STREAM_ENCODER_UNINITIALIZED"
445 };
446
447 FLAC_API const char * const FLAC__StreamEncoderWriteStatusString[] = {
448         "FLAC__STREAM_ENCODER_WRITE_STATUS_OK",
449         "FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR"
450 };
451
452 /***********************************************************************
453  *
454  * Class constructor/destructor
455  *
456  */
457 FLAC_API FLAC__StreamEncoder *FLAC__stream_encoder_new()
458 {
459         FLAC__StreamEncoder *encoder;
460         unsigned i;
461
462         FLAC__ASSERT(sizeof(int) >= 4); /* we want to die right away if this is not true */
463
464         encoder = (FLAC__StreamEncoder*)calloc(1, sizeof(FLAC__StreamEncoder));
465         if(encoder == 0) {
466                 return 0;
467         }
468
469         encoder->protected_ = (FLAC__StreamEncoderProtected*)calloc(1, sizeof(FLAC__StreamEncoderProtected));
470         if(encoder->protected_ == 0) {
471                 free(encoder);
472                 return 0;
473         }
474
475         encoder->private_ = (FLAC__StreamEncoderPrivate*)calloc(1, sizeof(FLAC__StreamEncoderPrivate));
476         if(encoder->private_ == 0) {
477                 free(encoder->protected_);
478                 free(encoder);
479                 return 0;
480         }
481
482         encoder->private_->frame = FLAC__bitbuffer_new();
483         if(encoder->private_->frame == 0) {
484                 free(encoder->private_);
485                 free(encoder->protected_);
486                 free(encoder);
487                 return 0;
488         }
489
490         set_defaults_(encoder);
491
492         encoder->private_->is_being_deleted = false;
493
494         for(i = 0; i < FLAC__MAX_CHANNELS; i++) {
495                 encoder->private_->subframe_workspace_ptr[i][0] = &encoder->private_->subframe_workspace[i][0];
496                 encoder->private_->subframe_workspace_ptr[i][1] = &encoder->private_->subframe_workspace[i][1];
497         }
498         for(i = 0; i < 2; i++) {
499                 encoder->private_->subframe_workspace_ptr_mid_side[i][0] = &encoder->private_->subframe_workspace_mid_side[i][0];
500                 encoder->private_->subframe_workspace_ptr_mid_side[i][1] = &encoder->private_->subframe_workspace_mid_side[i][1];
501         }
502         for(i = 0; i < FLAC__MAX_CHANNELS; i++) {
503                 encoder->private_->partitioned_rice_contents_workspace_ptr[i][0] = &encoder->private_->partitioned_rice_contents_workspace[i][0];
504                 encoder->private_->partitioned_rice_contents_workspace_ptr[i][1] = &encoder->private_->partitioned_rice_contents_workspace[i][1];
505         }
506         for(i = 0; i < 2; i++) {
507                 encoder->private_->partitioned_rice_contents_workspace_ptr_mid_side[i][0] = &encoder->private_->partitioned_rice_contents_workspace_mid_side[i][0];
508                 encoder->private_->partitioned_rice_contents_workspace_ptr_mid_side[i][1] = &encoder->private_->partitioned_rice_contents_workspace_mid_side[i][1];
509         }
510
511         for(i = 0; i < FLAC__MAX_CHANNELS; i++) {
512                 FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_workspace[i][0]);
513                 FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_workspace[i][1]);
514         }
515         for(i = 0; i < 2; i++) {
516                 FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_workspace_mid_side[i][0]);
517                 FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_workspace_mid_side[i][1]);
518         }
519         for(i = 0; i < 2; i++)
520                 FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_extra[i]);
521
522         encoder->protected_->state = FLAC__STREAM_ENCODER_UNINITIALIZED;
523
524         return encoder;
525 }
526
527 FLAC_API void FLAC__stream_encoder_delete(FLAC__StreamEncoder *encoder)
528 {
529         unsigned i;
530
531         FLAC__ASSERT(0 != encoder);
532         FLAC__ASSERT(0 != encoder->protected_);
533         FLAC__ASSERT(0 != encoder->private_);
534         FLAC__ASSERT(0 != encoder->private_->frame);
535
536         encoder->private_->is_being_deleted = true;
537
538         FLAC__stream_encoder_finish(encoder);
539
540         if(0 != encoder->private_->verify.decoder)
541                 FLAC__stream_decoder_delete(encoder->private_->verify.decoder);
542
543         for(i = 0; i < FLAC__MAX_CHANNELS; i++) {
544                 FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_workspace[i][0]);
545                 FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_workspace[i][1]);
546         }
547         for(i = 0; i < 2; i++) {
548                 FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_workspace_mid_side[i][0]);
549                 FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_workspace_mid_side[i][1]);
550         }
551         for(i = 0; i < 2; i++)
552                 FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_extra[i]);
553
554         FLAC__bitbuffer_delete(encoder->private_->frame);
555         free(encoder->private_);
556         free(encoder->protected_);
557         free(encoder);
558 }
559
560 /***********************************************************************
561  *
562  * Public class methods
563  *
564  ***********************************************************************/
565
566 FLAC_API FLAC__StreamEncoderState FLAC__stream_encoder_init(FLAC__StreamEncoder *encoder)
567 {
568         unsigned i;
569         FLAC__bool metadata_has_seektable, metadata_has_vorbis_comment;
570
571         FLAC__ASSERT(0 != encoder);
572
573         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
574                 return encoder->protected_->state = FLAC__STREAM_ENCODER_ALREADY_INITIALIZED;
575
576         encoder->protected_->state = FLAC__STREAM_ENCODER_OK;
577
578         if(0 == encoder->private_->write_callback || 0 == encoder->private_->metadata_callback)
579                 return encoder->protected_->state = FLAC__STREAM_ENCODER_INVALID_CALLBACK;
580
581         if(encoder->protected_->channels == 0 || encoder->protected_->channels > FLAC__MAX_CHANNELS)
582                 return encoder->protected_->state = FLAC__STREAM_ENCODER_INVALID_NUMBER_OF_CHANNELS;
583
584         if(encoder->protected_->do_mid_side_stereo && encoder->protected_->channels != 2)
585                 return encoder->protected_->state = FLAC__STREAM_ENCODER_MID_SIDE_CHANNELS_MISMATCH;
586
587         if(encoder->protected_->loose_mid_side_stereo && !encoder->protected_->do_mid_side_stereo)
588                 return encoder->protected_->state = FLAC__STREAM_ENCODER_ILLEGAL_MID_SIDE_FORCE;
589
590         if(encoder->protected_->bits_per_sample >= 32)
591                 encoder->protected_->do_mid_side_stereo = false; /* since we do 32-bit math, the side channel would have 33 bps and overflow */
592
593         if(encoder->protected_->bits_per_sample < FLAC__MIN_BITS_PER_SAMPLE || encoder->protected_->bits_per_sample > FLAC__REFERENCE_CODEC_MAX_BITS_PER_SAMPLE)
594                 return encoder->protected_->state = FLAC__STREAM_ENCODER_INVALID_BITS_PER_SAMPLE;
595
596         if(!FLAC__format_sample_rate_is_valid(encoder->protected_->sample_rate))
597                 return encoder->protected_->state = FLAC__STREAM_ENCODER_INVALID_SAMPLE_RATE;
598
599         if(encoder->protected_->blocksize < FLAC__MIN_BLOCK_SIZE || encoder->protected_->blocksize > FLAC__MAX_BLOCK_SIZE)
600                 return encoder->protected_->state = FLAC__STREAM_ENCODER_INVALID_BLOCK_SIZE;
601
602         if(encoder->protected_->max_lpc_order > FLAC__MAX_LPC_ORDER)
603                 return encoder->protected_->state = FLAC__STREAM_ENCODER_INVALID_MAX_LPC_ORDER;
604
605         if(encoder->protected_->blocksize < encoder->protected_->max_lpc_order)
606                 return encoder->protected_->state = FLAC__STREAM_ENCODER_BLOCK_SIZE_TOO_SMALL_FOR_LPC_ORDER;
607
608         if(encoder->protected_->qlp_coeff_precision == 0) {
609                 if(encoder->protected_->bits_per_sample < 16) {
610                         /* @@@ need some data about how to set this here w.r.t. blocksize and sample rate */
611                         /* @@@ until then we'll make a guess */
612                         encoder->protected_->qlp_coeff_precision = max(FLAC__MIN_QLP_COEFF_PRECISION, 2 + encoder->protected_->bits_per_sample / 2);
613                 }
614                 else if(encoder->protected_->bits_per_sample == 16) {
615                         if(encoder->protected_->blocksize <= 192)
616                                 encoder->protected_->qlp_coeff_precision = 7;
617                         else if(encoder->protected_->blocksize <= 384)
618                                 encoder->protected_->qlp_coeff_precision = 8;
619                         else if(encoder->protected_->blocksize <= 576)
620                                 encoder->protected_->qlp_coeff_precision = 9;
621                         else if(encoder->protected_->blocksize <= 1152)
622                                 encoder->protected_->qlp_coeff_precision = 10;
623                         else if(encoder->protected_->blocksize <= 2304)
624                                 encoder->protected_->qlp_coeff_precision = 11;
625                         else if(encoder->protected_->blocksize <= 4608)
626                                 encoder->protected_->qlp_coeff_precision = 12;
627                         else
628                                 encoder->protected_->qlp_coeff_precision = 13;
629                 }
630                 else {
631                         if(encoder->protected_->blocksize <= 384)
632                                 encoder->protected_->qlp_coeff_precision = FLAC__MAX_QLP_COEFF_PRECISION-2;
633                         else if(encoder->protected_->blocksize <= 1152)
634                                 encoder->protected_->qlp_coeff_precision = FLAC__MAX_QLP_COEFF_PRECISION-1;
635                         else
636                                 encoder->protected_->qlp_coeff_precision = FLAC__MAX_QLP_COEFF_PRECISION;
637                 }
638                 FLAC__ASSERT(encoder->protected_->qlp_coeff_precision <= FLAC__MAX_QLP_COEFF_PRECISION);
639         }
640         else if(encoder->protected_->qlp_coeff_precision < FLAC__MIN_QLP_COEFF_PRECISION || encoder->protected_->qlp_coeff_precision > FLAC__MAX_QLP_COEFF_PRECISION)
641                 return encoder->protected_->state = FLAC__STREAM_ENCODER_INVALID_QLP_COEFF_PRECISION;
642
643         if(encoder->protected_->streamable_subset) {
644                 if(
645                         encoder->protected_->blocksize != 192 &&
646                         encoder->protected_->blocksize != 576 &&
647                         encoder->protected_->blocksize != 1152 &&
648                         encoder->protected_->blocksize != 2304 &&
649                         encoder->protected_->blocksize != 4608 &&
650                         encoder->protected_->blocksize != 256 &&
651                         encoder->protected_->blocksize != 512 &&
652                         encoder->protected_->blocksize != 1024 &&
653                         encoder->protected_->blocksize != 2048 &&
654                         encoder->protected_->blocksize != 4096 &&
655                         encoder->protected_->blocksize != 8192 &&
656                         encoder->protected_->blocksize != 16384
657                 )
658                         return encoder->protected_->state = FLAC__STREAM_ENCODER_NOT_STREAMABLE;
659                 if(
660                         encoder->protected_->sample_rate != 8000 &&
661                         encoder->protected_->sample_rate != 16000 &&
662                         encoder->protected_->sample_rate != 22050 &&
663                         encoder->protected_->sample_rate != 24000 &&
664                         encoder->protected_->sample_rate != 32000 &&
665                         encoder->protected_->sample_rate != 44100 &&
666                         encoder->protected_->sample_rate != 48000 &&
667                         encoder->protected_->sample_rate != 96000
668                 )
669                         return encoder->protected_->state = FLAC__STREAM_ENCODER_NOT_STREAMABLE;
670                 if(
671                         encoder->protected_->bits_per_sample != 8 &&
672                         encoder->protected_->bits_per_sample != 12 &&
673                         encoder->protected_->bits_per_sample != 16 &&
674                         encoder->protected_->bits_per_sample != 20 &&
675                         encoder->protected_->bits_per_sample != 24
676                 )
677                         return encoder->protected_->state = FLAC__STREAM_ENCODER_NOT_STREAMABLE;
678                 if(encoder->protected_->max_residual_partition_order > FLAC__SUBSET_MAX_RICE_PARTITION_ORDER)
679                         return encoder->protected_->state = FLAC__STREAM_ENCODER_NOT_STREAMABLE;
680         }
681
682         if(encoder->protected_->max_residual_partition_order >= (1u << FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN))
683                 encoder->protected_->max_residual_partition_order = (1u << FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN) - 1;
684         if(encoder->protected_->min_residual_partition_order >= encoder->protected_->max_residual_partition_order)
685                 encoder->protected_->min_residual_partition_order = encoder->protected_->max_residual_partition_order;
686
687         /* validate metadata */
688         if(0 == encoder->protected_->metadata && encoder->protected_->num_metadata_blocks > 0)
689                 return encoder->protected_->state = FLAC__STREAM_ENCODER_INVALID_METADATA;
690         metadata_has_seektable = false;
691         metadata_has_vorbis_comment = false;
692         for(i = 0; i < encoder->protected_->num_metadata_blocks; i++) {
693                 if(encoder->protected_->metadata[i]->type == FLAC__METADATA_TYPE_STREAMINFO)
694                         return encoder->protected_->state = FLAC__STREAM_ENCODER_INVALID_METADATA;
695                 else if(encoder->protected_->metadata[i]->type == FLAC__METADATA_TYPE_SEEKTABLE) {
696                         if(metadata_has_seektable) /* only one is allowed */
697                                 return encoder->protected_->state = FLAC__STREAM_ENCODER_INVALID_METADATA;
698                         metadata_has_seektable = true;
699                         if(!FLAC__format_seektable_is_legal(&encoder->protected_->metadata[i]->data.seek_table))
700                                 return encoder->protected_->state = FLAC__STREAM_ENCODER_INVALID_METADATA;
701                 }
702                 else if(encoder->protected_->metadata[i]->type == FLAC__METADATA_TYPE_VORBIS_COMMENT) {
703                         if(metadata_has_vorbis_comment) /* only one is allowed */
704                                 return encoder->protected_->state = FLAC__STREAM_ENCODER_INVALID_METADATA;
705                         metadata_has_vorbis_comment = true;
706                 }
707                 else if(encoder->protected_->metadata[i]->type == FLAC__METADATA_TYPE_CUESHEET) {
708                         if(!FLAC__format_cuesheet_is_legal(&encoder->protected_->metadata[i]->data.cue_sheet, encoder->protected_->metadata[i]->data.cue_sheet.is_cd, /*violation=*/0))
709                                 return encoder->protected_->state = FLAC__STREAM_ENCODER_INVALID_METADATA;
710                 }
711         }
712
713         encoder->private_->input_capacity = 0;
714         for(i = 0; i < encoder->protected_->channels; i++) {
715                 encoder->private_->integer_signal_unaligned[i] = encoder->private_->integer_signal[i] = 0;
716 #ifndef FLAC__INTEGER_ONLY_LIBRARY
717                 encoder->private_->real_signal_unaligned[i] = encoder->private_->real_signal[i] = 0;
718 #endif
719         }
720         for(i = 0; i < 2; i++) {
721                 encoder->private_->integer_signal_mid_side_unaligned[i] = encoder->private_->integer_signal_mid_side[i] = 0;
722 #ifndef FLAC__INTEGER_ONLY_LIBRARY
723                 encoder->private_->real_signal_mid_side_unaligned[i] = encoder->private_->real_signal_mid_side[i] = 0;
724 #endif
725         }
726         for(i = 0; i < encoder->protected_->channels; i++) {
727                 encoder->private_->residual_workspace_unaligned[i][0] = encoder->private_->residual_workspace[i][0] = 0;
728                 encoder->private_->residual_workspace_unaligned[i][1] = encoder->private_->residual_workspace[i][1] = 0;
729                 encoder->private_->best_subframe[i] = 0;
730         }
731         for(i = 0; i < 2; i++) {
732                 encoder->private_->residual_workspace_mid_side_unaligned[i][0] = encoder->private_->residual_workspace_mid_side[i][0] = 0;
733                 encoder->private_->residual_workspace_mid_side_unaligned[i][1] = encoder->private_->residual_workspace_mid_side[i][1] = 0;
734                 encoder->private_->best_subframe_mid_side[i] = 0;
735         }
736         encoder->private_->abs_residual_unaligned = encoder->private_->abs_residual = 0;
737         encoder->private_->abs_residual_partition_sums_unaligned = encoder->private_->abs_residual_partition_sums = 0;
738         encoder->private_->raw_bits_per_partition_unaligned = encoder->private_->raw_bits_per_partition = 0;
739 #ifndef FLAC__INTEGER_ONLY_LIBRARY
740         encoder->private_->loose_mid_side_stereo_frames = (unsigned)((FLAC__double)encoder->protected_->sample_rate * 0.4 / (FLAC__double)encoder->protected_->blocksize + 0.5);
741 #else
742         /* 26214 is the approximate fixed-point equivalent to 0.4 (0.4 * 2^16) */
743         /* sample rate can be up to 655350 Hz, and thus use 20 bits, so we do the multiply&divide by hand */
744         FLAC__ASSERT(FLAC__MAX_SAMPLE_RATE <= 655350);
745         FLAC__ASSERT(FLAC__MAX_BLOCK_SIZE <= 65535);
746         FLAC__ASSERT(encoder->protected_->sample_rate <= 655350);
747         FLAC__ASSERT(encoder->protected_->blocksize <= 65535);
748         encoder->private_->loose_mid_side_stereo_frames = (unsigned)FLAC__fixedpoint_trunc((((FLAC__uint64)(encoder->protected_->sample_rate) * (FLAC__uint64)(26214)) << 16) / (encoder->protected_->blocksize<<16) + FLAC__FP_ONE_HALF);
749 #endif
750         if(encoder->private_->loose_mid_side_stereo_frames == 0)
751                 encoder->private_->loose_mid_side_stereo_frames = 1;
752         encoder->private_->loose_mid_side_stereo_frame_count = 0;
753         encoder->private_->current_sample_number = 0;
754         encoder->private_->current_frame_number = 0;
755
756         encoder->private_->use_wide_by_block = (encoder->protected_->bits_per_sample + FLAC__bitmath_ilog2(encoder->protected_->blocksize)+1 > 30);
757         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? */
758         encoder->private_->use_wide_by_partition = (false); /*@@@ need to set this */
759
760         /*
761          * get the CPU info and set the function pointers
762          */
763         FLAC__cpu_info(&encoder->private_->cpuinfo);
764         /* first default to the non-asm routines */
765 #ifndef FLAC__INTEGER_ONLY_LIBRARY
766         encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation;
767 #endif
768         encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor;
769 #ifndef FLAC__INTEGER_ONLY_LIBRARY
770         encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients;
771         encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit = FLAC__lpc_compute_residual_from_qlp_coefficients_wide;
772         encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients;
773 #endif
774         /* now override with asm where appropriate */
775 #ifndef FLAC__INTEGER_ONLY_LIBRARY
776 # ifndef FLAC__NO_ASM
777         if(encoder->private_->cpuinfo.use_asm) {
778 #  ifdef FLAC__CPU_IA32
779                 FLAC__ASSERT(encoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_IA32);
780 #   ifdef FLAC__HAS_NASM
781 #    ifdef FLAC__SSE_OS
782                 if(encoder->private_->cpuinfo.data.ia32.sse) {
783                         if(encoder->protected_->max_lpc_order < 4)
784                                 encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_4;
785                         else if(encoder->protected_->max_lpc_order < 8)
786                                 encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_8;
787                         else if(encoder->protected_->max_lpc_order < 12)
788                                 encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_12;
789                         else
790                                 encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32;
791                 }
792                 else
793 #    endif /* FLAC__SSE_OS */
794                 if(encoder->private_->cpuinfo.data.ia32._3dnow)
795                         encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_3dnow;
796                 else
797                         encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32;
798                 if(encoder->private_->cpuinfo.data.ia32.mmx) {
799                         encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32;
800                         encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx;
801                 }
802                 else {
803                         encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32;
804                         encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32;
805                 }
806                 if(encoder->private_->cpuinfo.data.ia32.mmx && encoder->private_->cpuinfo.data.ia32.cmov)
807                         encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_asm_ia32_mmx_cmov;
808 #   endif /* FLAC__HAS_NASM */
809 #  endif /* FLAC__CPU_IA32 */
810         }
811 # endif /* !FLAC__NO_ASM */
812 #endif /* !FLAC__INTEGER_ONLY_LIBRARY */
813         /* finally override based on wide-ness if necessary */
814         if(encoder->private_->use_wide_by_block) {
815                 encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_wide;
816         }
817
818         /* we require precompute_partition_sums if do_escape_coding because of their intertwined nature */
819         encoder->private_->precompute_partition_sums = (encoder->protected_->max_residual_partition_order > encoder->protected_->min_residual_partition_order) || encoder->protected_->do_escape_coding;
820
821         if(!resize_buffers_(encoder, encoder->protected_->blocksize)) {
822                 /* the above function sets the state for us in case of an error */
823                 return encoder->protected_->state;
824         }
825
826         if(!FLAC__bitbuffer_init(encoder->private_->frame))
827                 return encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
828
829         /*
830          * Set up the verify stuff if necessary
831          */
832         if(encoder->protected_->verify) {
833                 /*
834                  * First, set up the fifo which will hold the
835                  * original signal to compare against
836                  */
837                 encoder->private_->verify.input_fifo.size = encoder->protected_->blocksize;
838                 for(i = 0; i < encoder->protected_->channels; i++) {
839                         if(0 == (encoder->private_->verify.input_fifo.data[i] = (FLAC__int32*)malloc(sizeof(FLAC__int32) * encoder->private_->verify.input_fifo.size)))
840                                 return encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
841                 }
842                 encoder->private_->verify.input_fifo.tail = 0;
843
844                 /*
845                  * Now set up a stream decoder for verification
846                  */
847                 encoder->private_->verify.decoder = FLAC__stream_decoder_new();
848                 if(0 == encoder->private_->verify.decoder)
849                         return encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR;
850
851                 FLAC__stream_decoder_set_read_callback(encoder->private_->verify.decoder, verify_read_callback_);
852                 FLAC__stream_decoder_set_write_callback(encoder->private_->verify.decoder, verify_write_callback_);
853                 FLAC__stream_decoder_set_metadata_callback(encoder->private_->verify.decoder, verify_metadata_callback_);
854                 FLAC__stream_decoder_set_error_callback(encoder->private_->verify.decoder, verify_error_callback_);
855                 FLAC__stream_decoder_set_client_data(encoder->private_->verify.decoder, encoder);
856                 if(FLAC__stream_decoder_init(encoder->private_->verify.decoder) != FLAC__STREAM_DECODER_SEARCH_FOR_METADATA)
857                         return encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR;
858         }
859         encoder->private_->verify.error_stats.absolute_sample = 0;
860         encoder->private_->verify.error_stats.frame_number = 0;
861         encoder->private_->verify.error_stats.channel = 0;
862         encoder->private_->verify.error_stats.sample = 0;
863         encoder->private_->verify.error_stats.expected = 0;
864         encoder->private_->verify.error_stats.got = 0;
865
866         /*
867          * write the stream header
868          */
869         if(encoder->protected_->verify)
870                 encoder->private_->verify.state_hint = ENCODER_IN_MAGIC;
871         if(!FLAC__bitbuffer_write_raw_uint32(encoder->private_->frame, FLAC__STREAM_SYNC, FLAC__STREAM_SYNC_LEN))
872                 return encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
873         if(!write_bitbuffer_(encoder, 0)) {
874                 /* the above function sets the state for us in case of an error */
875                 return encoder->protected_->state;
876         }
877
878         /*
879          * write the STREAMINFO metadata block
880          */
881         if(encoder->protected_->verify)
882                 encoder->private_->verify.state_hint = ENCODER_IN_METADATA;
883         encoder->private_->metadata.type = FLAC__METADATA_TYPE_STREAMINFO;
884         encoder->private_->metadata.is_last = false; /* we will have at a minimum a VORBIS_COMMENT afterwards */
885         encoder->private_->metadata.length = FLAC__STREAM_METADATA_STREAMINFO_LENGTH;
886         encoder->private_->metadata.data.stream_info.min_blocksize = encoder->protected_->blocksize; /* this encoder uses the same blocksize for the whole stream */
887         encoder->private_->metadata.data.stream_info.max_blocksize = encoder->protected_->blocksize;
888         encoder->private_->metadata.data.stream_info.min_framesize = 0; /* we don't know this yet; have to fill it in later */
889         encoder->private_->metadata.data.stream_info.max_framesize = 0; /* we don't know this yet; have to fill it in later */
890         encoder->private_->metadata.data.stream_info.sample_rate = encoder->protected_->sample_rate;
891         encoder->private_->metadata.data.stream_info.channels = encoder->protected_->channels;
892         encoder->private_->metadata.data.stream_info.bits_per_sample = encoder->protected_->bits_per_sample;
893         encoder->private_->metadata.data.stream_info.total_samples = encoder->protected_->total_samples_estimate; /* we will replace this later with the real total */
894         memset(encoder->private_->metadata.data.stream_info.md5sum, 0, 16); /* we don't know this yet; have to fill it in later */
895         FLAC__MD5Init(&encoder->private_->md5context);
896         if(!FLAC__bitbuffer_clear(encoder->private_->frame))
897                 return encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
898         if(!FLAC__add_metadata_block(&encoder->private_->metadata, encoder->private_->frame))
899                 return encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
900         if(!write_bitbuffer_(encoder, 0)) {
901                 /* the above function sets the state for us in case of an error */
902                 return encoder->protected_->state;
903         }
904
905         /*
906          * Now that the STREAMINFO block is written, we can init this to an
907          * absurdly-high value...
908          */
909         encoder->private_->metadata.data.stream_info.min_framesize = (1u << FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN) - 1;
910         /* ... and clear this to 0 */
911         encoder->private_->metadata.data.stream_info.total_samples = 0;
912
913         /*
914          * Check to see if the supplied metadata contains a VORBIS_COMMENT;
915          * if not, we will write an empty one (FLAC__add_metadata_block()
916          * automatically supplies the vendor string).
917          *
918          * WATCHOUT: libOggFLAC depends on us to write this block after the
919          * STREAMINFO since that's what the mapping requires.  (In the case
920          * that metadata_has_vorbis_comment is true it will have already
921          * insured that the metadata list is properly ordered.)
922          */
923         if(!metadata_has_vorbis_comment) {
924                 FLAC__StreamMetadata vorbis_comment;
925                 vorbis_comment.type = FLAC__METADATA_TYPE_VORBIS_COMMENT;
926                 vorbis_comment.is_last = (encoder->protected_->num_metadata_blocks == 0);
927                 vorbis_comment.length = 4 + 4; /* MAGIC NUMBER */
928                 vorbis_comment.data.vorbis_comment.vendor_string.length = 0;
929                 vorbis_comment.data.vorbis_comment.vendor_string.entry = 0;
930                 vorbis_comment.data.vorbis_comment.num_comments = 0;
931                 vorbis_comment.data.vorbis_comment.comments = 0;
932                 if(!FLAC__bitbuffer_clear(encoder->private_->frame))
933                         return encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
934                 if(!FLAC__add_metadata_block(&vorbis_comment, encoder->private_->frame))
935                         return encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
936                 if(!write_bitbuffer_(encoder, 0)) {
937                         /* the above function sets the state for us in case of an error */
938                         return encoder->protected_->state;
939                 }
940         }
941
942         /*
943          * write the user's metadata blocks
944          */
945         for(i = 0; i < encoder->protected_->num_metadata_blocks; i++) {
946                 encoder->protected_->metadata[i]->is_last = (i == encoder->protected_->num_metadata_blocks - 1);
947                 if(!FLAC__bitbuffer_clear(encoder->private_->frame))
948                         return encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
949                 if(!FLAC__add_metadata_block(encoder->protected_->metadata[i], encoder->private_->frame))
950                         return encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
951                 if(!write_bitbuffer_(encoder, 0)) {
952                         /* the above function sets the state for us in case of an error */
953                         return encoder->protected_->state;
954                 }
955         }
956
957         if(encoder->protected_->verify)
958                 encoder->private_->verify.state_hint = ENCODER_IN_AUDIO;
959
960         return encoder->protected_->state;
961 }
962
963 FLAC_API void FLAC__stream_encoder_finish(FLAC__StreamEncoder *encoder)
964 {
965         FLAC__ASSERT(0 != encoder);
966
967         if(encoder->protected_->state == FLAC__STREAM_ENCODER_UNINITIALIZED)
968                 return;
969
970         if(encoder->protected_->state == FLAC__STREAM_ENCODER_OK && !encoder->private_->is_being_deleted) {
971                 if(encoder->private_->current_sample_number != 0) {
972                         encoder->protected_->blocksize = encoder->private_->current_sample_number;
973                         process_frame_(encoder, true); /* true => is last frame */
974                 }
975         }
976
977         FLAC__MD5Final(encoder->private_->metadata.data.stream_info.md5sum, &encoder->private_->md5context);
978
979         if(encoder->protected_->state == FLAC__STREAM_ENCODER_OK && !encoder->private_->is_being_deleted) {
980                 encoder->private_->metadata_callback(encoder, &encoder->private_->metadata, encoder->private_->client_data);
981         }
982
983         if(encoder->protected_->verify && 0 != encoder->private_->verify.decoder)
984                 FLAC__stream_decoder_finish(encoder->private_->verify.decoder);
985
986         free_(encoder);
987         set_defaults_(encoder);
988
989         encoder->protected_->state = FLAC__STREAM_ENCODER_UNINITIALIZED;
990 }
991
992 FLAC_API FLAC__bool FLAC__stream_encoder_set_verify(FLAC__StreamEncoder *encoder, FLAC__bool value)
993 {
994         FLAC__ASSERT(0 != encoder);
995         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
996                 return false;
997         encoder->protected_->verify = value;
998         return true;
999 }
1000
1001 FLAC_API FLAC__bool FLAC__stream_encoder_set_streamable_subset(FLAC__StreamEncoder *encoder, FLAC__bool value)
1002 {
1003         FLAC__ASSERT(0 != encoder);
1004         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1005                 return false;
1006         encoder->protected_->streamable_subset = value;
1007         return true;
1008 }
1009
1010 FLAC_API FLAC__bool FLAC__stream_encoder_set_do_mid_side_stereo(FLAC__StreamEncoder *encoder, FLAC__bool value)
1011 {
1012         FLAC__ASSERT(0 != encoder);
1013         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1014                 return false;
1015         encoder->protected_->do_mid_side_stereo = value;
1016         return true;
1017 }
1018
1019 FLAC_API FLAC__bool FLAC__stream_encoder_set_loose_mid_side_stereo(FLAC__StreamEncoder *encoder, FLAC__bool value)
1020 {
1021         FLAC__ASSERT(0 != encoder);
1022         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1023                 return false;
1024         encoder->protected_->loose_mid_side_stereo = value;
1025         return true;
1026 }
1027
1028 FLAC_API FLAC__bool FLAC__stream_encoder_set_channels(FLAC__StreamEncoder *encoder, unsigned value)
1029 {
1030         FLAC__ASSERT(0 != encoder);
1031         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1032                 return false;
1033         encoder->protected_->channels = value;
1034         return true;
1035 }
1036
1037 FLAC_API FLAC__bool FLAC__stream_encoder_set_bits_per_sample(FLAC__StreamEncoder *encoder, unsigned value)
1038 {
1039         FLAC__ASSERT(0 != encoder);
1040         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1041                 return false;
1042         encoder->protected_->bits_per_sample = value;
1043         return true;
1044 }
1045
1046 FLAC_API FLAC__bool FLAC__stream_encoder_set_sample_rate(FLAC__StreamEncoder *encoder, unsigned value)
1047 {
1048         FLAC__ASSERT(0 != encoder);
1049         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1050                 return false;
1051         encoder->protected_->sample_rate = value;
1052         return true;
1053 }
1054
1055 FLAC_API FLAC__bool FLAC__stream_encoder_set_blocksize(FLAC__StreamEncoder *encoder, unsigned value)
1056 {
1057         FLAC__ASSERT(0 != encoder);
1058         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1059                 return false;
1060         encoder->protected_->blocksize = value;
1061         return true;
1062 }
1063
1064 FLAC_API FLAC__bool FLAC__stream_encoder_set_max_lpc_order(FLAC__StreamEncoder *encoder, unsigned value)
1065 {
1066         FLAC__ASSERT(0 != encoder);
1067         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1068                 return false;
1069         encoder->protected_->max_lpc_order = value;
1070         return true;
1071 }
1072
1073 FLAC_API FLAC__bool FLAC__stream_encoder_set_qlp_coeff_precision(FLAC__StreamEncoder *encoder, unsigned value)
1074 {
1075         FLAC__ASSERT(0 != encoder);
1076         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1077                 return false;
1078         encoder->protected_->qlp_coeff_precision = value;
1079         return true;
1080 }
1081
1082 FLAC_API FLAC__bool FLAC__stream_encoder_set_do_qlp_coeff_prec_search(FLAC__StreamEncoder *encoder, FLAC__bool value)
1083 {
1084         FLAC__ASSERT(0 != encoder);
1085         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1086                 return false;
1087         encoder->protected_->do_qlp_coeff_prec_search = value;
1088         return true;
1089 }
1090
1091 FLAC_API FLAC__bool FLAC__stream_encoder_set_do_escape_coding(FLAC__StreamEncoder *encoder, FLAC__bool value)
1092 {
1093         FLAC__ASSERT(0 != encoder);
1094         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1095                 return false;
1096 #if 0
1097         /*@@@ deprecated: */
1098         encoder->protected_->do_escape_coding = value;
1099 #else
1100         (void)value;
1101 #endif
1102         return true;
1103 }
1104
1105 FLAC_API FLAC__bool FLAC__stream_encoder_set_do_exhaustive_model_search(FLAC__StreamEncoder *encoder, FLAC__bool value)
1106 {
1107         FLAC__ASSERT(0 != encoder);
1108         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1109                 return false;
1110         encoder->protected_->do_exhaustive_model_search = value;
1111         return true;
1112 }
1113
1114 FLAC_API FLAC__bool FLAC__stream_encoder_set_min_residual_partition_order(FLAC__StreamEncoder *encoder, unsigned value)
1115 {
1116         FLAC__ASSERT(0 != encoder);
1117         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1118                 return false;
1119         encoder->protected_->min_residual_partition_order = value;
1120         return true;
1121 }
1122
1123 FLAC_API FLAC__bool FLAC__stream_encoder_set_max_residual_partition_order(FLAC__StreamEncoder *encoder, unsigned value)
1124 {
1125         FLAC__ASSERT(0 != encoder);
1126         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1127                 return false;
1128         encoder->protected_->max_residual_partition_order = value;
1129         return true;
1130 }
1131
1132 FLAC_API FLAC__bool FLAC__stream_encoder_set_rice_parameter_search_dist(FLAC__StreamEncoder *encoder, unsigned value)
1133 {
1134         FLAC__ASSERT(0 != encoder);
1135         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1136                 return false;
1137 #if 0
1138         /*@@@ deprecated: */
1139         encoder->protected_->rice_parameter_search_dist = value;
1140 #else
1141         (void)value;
1142 #endif
1143         return true;
1144 }
1145
1146 FLAC_API FLAC__bool FLAC__stream_encoder_set_total_samples_estimate(FLAC__StreamEncoder *encoder, FLAC__uint64 value)
1147 {
1148         FLAC__ASSERT(0 != encoder);
1149         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1150                 return false;
1151         encoder->protected_->total_samples_estimate = value;
1152         return true;
1153 }
1154
1155 FLAC_API FLAC__bool FLAC__stream_encoder_set_metadata(FLAC__StreamEncoder *encoder, FLAC__StreamMetadata **metadata, unsigned num_blocks)
1156 {
1157         FLAC__ASSERT(0 != encoder);
1158         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1159                 return false;
1160         encoder->protected_->metadata = metadata;
1161         encoder->protected_->num_metadata_blocks = num_blocks;
1162         return true;
1163 }
1164
1165 FLAC_API FLAC__bool FLAC__stream_encoder_set_write_callback(FLAC__StreamEncoder *encoder, FLAC__StreamEncoderWriteCallback value)
1166 {
1167         FLAC__ASSERT(0 != encoder);
1168         FLAC__ASSERT(0 != value);
1169         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1170                 return false;
1171         encoder->private_->write_callback = value;
1172         return true;
1173 }
1174
1175 FLAC_API FLAC__bool FLAC__stream_encoder_set_metadata_callback(FLAC__StreamEncoder *encoder, FLAC__StreamEncoderMetadataCallback value)
1176 {
1177         FLAC__ASSERT(0 != encoder);
1178         FLAC__ASSERT(0 != value);
1179         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1180                 return false;
1181         encoder->private_->metadata_callback = value;
1182         return true;
1183 }
1184
1185 FLAC_API FLAC__bool FLAC__stream_encoder_set_client_data(FLAC__StreamEncoder *encoder, void *value)
1186 {
1187         FLAC__ASSERT(0 != encoder);
1188         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1189                 return false;
1190         encoder->private_->client_data = value;
1191         return true;
1192 }
1193
1194 /*
1195  * These three functions are not static, but not publically exposed in
1196  * include/FLAC/ either.  They are used by the test suite.
1197  */
1198 FLAC_API FLAC__bool FLAC__stream_encoder_disable_constant_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value)
1199 {
1200         FLAC__ASSERT(0 != encoder);
1201         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1202                 return false;
1203         encoder->private_->disable_constant_subframes = value;
1204         return true;
1205 }
1206
1207 FLAC_API FLAC__bool FLAC__stream_encoder_disable_fixed_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value)
1208 {
1209         FLAC__ASSERT(0 != encoder);
1210         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1211                 return false;
1212         encoder->private_->disable_fixed_subframes = value;
1213         return true;
1214 }
1215
1216 FLAC_API FLAC__bool FLAC__stream_encoder_disable_verbatim_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value)
1217 {
1218         FLAC__ASSERT(0 != encoder);
1219         if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
1220                 return false;
1221         encoder->private_->disable_verbatim_subframes = value;
1222         return true;
1223 }
1224
1225 FLAC_API FLAC__StreamEncoderState FLAC__stream_encoder_get_state(const FLAC__StreamEncoder *encoder)
1226 {
1227         FLAC__ASSERT(0 != encoder);
1228         return encoder->protected_->state;
1229 }
1230
1231 FLAC_API FLAC__StreamDecoderState FLAC__stream_encoder_get_verify_decoder_state(const FLAC__StreamEncoder *encoder)
1232 {
1233         FLAC__ASSERT(0 != encoder);
1234         if(encoder->protected_->verify)
1235                 return FLAC__stream_decoder_get_state(encoder->private_->verify.decoder);
1236         else
1237                 return FLAC__STREAM_DECODER_UNINITIALIZED;
1238 }
1239
1240 FLAC_API const char *FLAC__stream_encoder_get_resolved_state_string(const FLAC__StreamEncoder *encoder)
1241 {
1242         if(encoder->protected_->state != FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR)
1243                 return FLAC__StreamEncoderStateString[encoder->protected_->state];
1244         else
1245                 return FLAC__stream_decoder_get_resolved_state_string(encoder->private_->verify.decoder);
1246 }
1247
1248 FLAC_API void FLAC__stream_encoder_get_verify_decoder_error_stats(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_sample, unsigned *frame_number, unsigned *channel, unsigned *sample, FLAC__int32 *expected, FLAC__int32 *got)
1249 {
1250         FLAC__ASSERT(0 != encoder);
1251         if(0 != absolute_sample)
1252                 *absolute_sample = encoder->private_->verify.error_stats.absolute_sample;
1253         if(0 != frame_number)
1254                 *frame_number = encoder->private_->verify.error_stats.frame_number;
1255         if(0 != channel)
1256                 *channel = encoder->private_->verify.error_stats.channel;
1257         if(0 != sample)
1258                 *sample = encoder->private_->verify.error_stats.sample;
1259         if(0 != expected)
1260                 *expected = encoder->private_->verify.error_stats.expected;
1261         if(0 != got)
1262                 *got = encoder->private_->verify.error_stats.got;
1263 }
1264
1265 FLAC_API FLAC__bool FLAC__stream_encoder_get_verify(const FLAC__StreamEncoder *encoder)
1266 {
1267         FLAC__ASSERT(0 != encoder);
1268         return encoder->protected_->verify;
1269 }
1270
1271 FLAC_API FLAC__bool FLAC__stream_encoder_get_streamable_subset(const FLAC__StreamEncoder *encoder)
1272 {
1273         FLAC__ASSERT(0 != encoder);
1274         return encoder->protected_->streamable_subset;
1275 }
1276
1277 FLAC_API FLAC__bool FLAC__stream_encoder_get_do_mid_side_stereo(const FLAC__StreamEncoder *encoder)
1278 {
1279         FLAC__ASSERT(0 != encoder);
1280         return encoder->protected_->do_mid_side_stereo;
1281 }
1282
1283 FLAC_API FLAC__bool FLAC__stream_encoder_get_loose_mid_side_stereo(const FLAC__StreamEncoder *encoder)
1284 {
1285         FLAC__ASSERT(0 != encoder);
1286         return encoder->protected_->loose_mid_side_stereo;
1287 }
1288
1289 FLAC_API unsigned FLAC__stream_encoder_get_channels(const FLAC__StreamEncoder *encoder)
1290 {
1291         FLAC__ASSERT(0 != encoder);
1292         return encoder->protected_->channels;
1293 }
1294
1295 FLAC_API unsigned FLAC__stream_encoder_get_bits_per_sample(const FLAC__StreamEncoder *encoder)
1296 {
1297         FLAC__ASSERT(0 != encoder);
1298         return encoder->protected_->bits_per_sample;
1299 }
1300
1301 FLAC_API unsigned FLAC__stream_encoder_get_sample_rate(const FLAC__StreamEncoder *encoder)
1302 {
1303         FLAC__ASSERT(0 != encoder);
1304         return encoder->protected_->sample_rate;
1305 }
1306
1307 FLAC_API unsigned FLAC__stream_encoder_get_blocksize(const FLAC__StreamEncoder *encoder)
1308 {
1309         FLAC__ASSERT(0 != encoder);
1310         return encoder->protected_->blocksize;
1311 }
1312
1313 FLAC_API unsigned FLAC__stream_encoder_get_max_lpc_order(const FLAC__StreamEncoder *encoder)
1314 {
1315         FLAC__ASSERT(0 != encoder);
1316         return encoder->protected_->max_lpc_order;
1317 }
1318
1319 FLAC_API unsigned FLAC__stream_encoder_get_qlp_coeff_precision(const FLAC__StreamEncoder *encoder)
1320 {
1321         FLAC__ASSERT(0 != encoder);
1322         return encoder->protected_->qlp_coeff_precision;
1323 }
1324
1325 FLAC_API FLAC__bool FLAC__stream_encoder_get_do_qlp_coeff_prec_search(const FLAC__StreamEncoder *encoder)
1326 {
1327         FLAC__ASSERT(0 != encoder);
1328         return encoder->protected_->do_qlp_coeff_prec_search;
1329 }
1330
1331 FLAC_API FLAC__bool FLAC__stream_encoder_get_do_escape_coding(const FLAC__StreamEncoder *encoder)
1332 {
1333         FLAC__ASSERT(0 != encoder);
1334         return encoder->protected_->do_escape_coding;
1335 }
1336
1337 FLAC_API FLAC__bool FLAC__stream_encoder_get_do_exhaustive_model_search(const FLAC__StreamEncoder *encoder)
1338 {
1339         FLAC__ASSERT(0 != encoder);
1340         return encoder->protected_->do_exhaustive_model_search;
1341 }
1342
1343 FLAC_API unsigned FLAC__stream_encoder_get_min_residual_partition_order(const FLAC__StreamEncoder *encoder)
1344 {
1345         FLAC__ASSERT(0 != encoder);
1346         return encoder->protected_->min_residual_partition_order;
1347 }
1348
1349 FLAC_API unsigned FLAC__stream_encoder_get_max_residual_partition_order(const FLAC__StreamEncoder *encoder)
1350 {
1351         FLAC__ASSERT(0 != encoder);
1352         return encoder->protected_->max_residual_partition_order;
1353 }
1354
1355 FLAC_API unsigned FLAC__stream_encoder_get_rice_parameter_search_dist(const FLAC__StreamEncoder *encoder)
1356 {
1357         FLAC__ASSERT(0 != encoder);
1358         return encoder->protected_->rice_parameter_search_dist;
1359 }
1360
1361 FLAC_API FLAC__uint64 FLAC__stream_encoder_get_total_samples_estimate(const FLAC__StreamEncoder *encoder)
1362 {
1363         FLAC__ASSERT(0 != encoder);
1364         return encoder->protected_->total_samples_estimate;
1365 }
1366
1367 FLAC_API FLAC__bool FLAC__stream_encoder_process(FLAC__StreamEncoder *encoder, const FLAC__int32 * const buffer[], unsigned samples)
1368 {
1369         unsigned i, j, channel;
1370         FLAC__int32 x, mid, side;
1371         const unsigned channels = encoder->protected_->channels, blocksize = encoder->protected_->blocksize;
1372
1373         FLAC__ASSERT(0 != encoder);
1374         FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK);
1375
1376         j = 0;
1377         if(encoder->protected_->do_mid_side_stereo && channels == 2) {
1378                 do {
1379                         if(encoder->protected_->verify)
1380                                 append_to_verify_fifo_(&encoder->private_->verify.input_fifo, buffer, j, channels, min(blocksize-encoder->private_->current_sample_number, samples-j));
1381
1382                         for(i = encoder->private_->current_sample_number; i < blocksize && j < samples; i++, j++) {
1383                                 x = mid = side = buffer[0][j];
1384                                 encoder->private_->integer_signal[0][i] = x;
1385 #ifndef FLAC__INTEGER_ONLY_LIBRARY
1386                                 encoder->private_->real_signal[0][i] = (FLAC__real)x;
1387 #endif
1388                                 x = buffer[1][j];
1389                                 encoder->private_->integer_signal[1][i] = x;
1390 #ifndef FLAC__INTEGER_ONLY_LIBRARY
1391                                 encoder->private_->real_signal[1][i] = (FLAC__real)x;
1392 #endif
1393                                 mid += x;
1394                                 side -= x;
1395                                 mid >>= 1; /* NOTE: not the same as 'mid = (buffer[0][j] + buffer[1][j]) / 2' ! */
1396                                 encoder->private_->integer_signal_mid_side[1][i] = side;
1397                                 encoder->private_->integer_signal_mid_side[0][i] = mid;
1398 #ifndef FLAC__INTEGER_ONLY_LIBRARY
1399                                 encoder->private_->real_signal_mid_side[1][i] = (FLAC__real)side;
1400                                 encoder->private_->real_signal_mid_side[0][i] = (FLAC__real)mid;
1401 #endif
1402                                 encoder->private_->current_sample_number++;
1403                         }
1404                         if(i == blocksize) {
1405                                 if(!process_frame_(encoder, false)) /* false => not last frame */
1406                                         return false;
1407                         }
1408                 } while(j < samples);
1409         }
1410         else {
1411                 do {
1412                         if(encoder->protected_->verify)
1413                                 append_to_verify_fifo_(&encoder->private_->verify.input_fifo, buffer, j, channels, min(blocksize-encoder->private_->current_sample_number, samples-j));
1414
1415                         for(i = encoder->private_->current_sample_number; i < blocksize && j < samples; i++, j++) {
1416                                 for(channel = 0; channel < channels; channel++) {
1417                                         x = buffer[channel][j];
1418                                         encoder->private_->integer_signal[channel][i] = x;
1419 #ifndef FLAC__INTEGER_ONLY_LIBRARY
1420                                         encoder->private_->real_signal[channel][i] = (FLAC__real)x;
1421 #endif
1422                                 }
1423                                 encoder->private_->current_sample_number++;
1424                         }
1425                         if(i == blocksize) {
1426                                 if(!process_frame_(encoder, false)) /* false => not last frame */
1427                                         return false;
1428                         }
1429                 } while(j < samples);
1430         }
1431
1432         return true;
1433 }
1434
1435 FLAC_API FLAC__bool FLAC__stream_encoder_process_interleaved(FLAC__StreamEncoder *encoder, const FLAC__int32 buffer[], unsigned samples)
1436 {
1437         unsigned i, j, k, channel;
1438         FLAC__int32 x, mid, side;
1439         const unsigned channels = encoder->protected_->channels, blocksize = encoder->protected_->blocksize;
1440
1441         FLAC__ASSERT(0 != encoder);
1442         FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK);
1443
1444         j = k = 0;
1445         if(encoder->protected_->do_mid_side_stereo && channels == 2) {
1446                 do {
1447                         if(encoder->protected_->verify)
1448                                 append_to_verify_fifo_interleaved_(&encoder->private_->verify.input_fifo, buffer, j, channels, min(blocksize-encoder->private_->current_sample_number, samples-j));
1449
1450                         for(i = encoder->private_->current_sample_number; i < blocksize && j < samples; i++, j++) {
1451                                 x = mid = side = buffer[k++];
1452                                 encoder->private_->integer_signal[0][i] = x;
1453 #ifndef FLAC__INTEGER_ONLY_LIBRARY
1454                                 encoder->private_->real_signal[0][i] = (FLAC__real)x;
1455 #endif
1456                                 x = buffer[k++];
1457                                 encoder->private_->integer_signal[1][i] = x;
1458 #ifndef FLAC__INTEGER_ONLY_LIBRARY
1459                                 encoder->private_->real_signal[1][i] = (FLAC__real)x;
1460 #endif
1461                                 mid += x;
1462                                 side -= x;
1463                                 mid >>= 1; /* NOTE: not the same as 'mid = (left + right) / 2' ! */
1464                                 encoder->private_->integer_signal_mid_side[1][i] = side;
1465                                 encoder->private_->integer_signal_mid_side[0][i] = mid;
1466 #ifndef FLAC__INTEGER_ONLY_LIBRARY
1467                                 encoder->private_->real_signal_mid_side[1][i] = (FLAC__real)side;
1468                                 encoder->private_->real_signal_mid_side[0][i] = (FLAC__real)mid;
1469 #endif
1470                                 encoder->private_->current_sample_number++;
1471                         }
1472                         if(i == blocksize) {
1473                                 if(!process_frame_(encoder, false)) /* false => not last frame */
1474                                         return false;
1475                         }
1476                 } while(j < samples);
1477         }
1478         else {
1479                 do {
1480                         if(encoder->protected_->verify)
1481                                 append_to_verify_fifo_interleaved_(&encoder->private_->verify.input_fifo, buffer, j, channels, min(blocksize-encoder->private_->current_sample_number, samples-j));
1482
1483                         for(i = encoder->private_->current_sample_number; i < blocksize && j < samples; i++, j++) {
1484                                 for(channel = 0; channel < channels; channel++) {
1485                                         x = buffer[k++];
1486                                         encoder->private_->integer_signal[channel][i] = x;
1487 #ifndef FLAC__INTEGER_ONLY_LIBRARY
1488                                         encoder->private_->real_signal[channel][i] = (FLAC__real)x;
1489 #endif
1490                                 }
1491                                 encoder->private_->current_sample_number++;
1492                         }
1493                         if(i == blocksize) {
1494                                 if(!process_frame_(encoder, false)) /* false => not last frame */
1495                                         return false;
1496                         }
1497                 } while(j < samples);
1498         }
1499
1500         return true;
1501 }
1502
1503 /***********************************************************************
1504  *
1505  * Private class methods
1506  *
1507  ***********************************************************************/
1508
1509 void set_defaults_(FLAC__StreamEncoder *encoder)
1510 {
1511         FLAC__ASSERT(0 != encoder);
1512
1513         encoder->protected_->verify = false;
1514         encoder->protected_->streamable_subset = true;
1515         encoder->protected_->do_mid_side_stereo = false;
1516         encoder->protected_->loose_mid_side_stereo = false;
1517         encoder->protected_->channels = 2;
1518         encoder->protected_->bits_per_sample = 16;
1519         encoder->protected_->sample_rate = 44100;
1520         encoder->protected_->blocksize = 1152;
1521         encoder->protected_->max_lpc_order = 0;
1522         encoder->protected_->qlp_coeff_precision = 0;
1523         encoder->protected_->do_qlp_coeff_prec_search = false;
1524         encoder->protected_->do_exhaustive_model_search = false;
1525         encoder->protected_->do_escape_coding = false;
1526         encoder->protected_->min_residual_partition_order = 0;
1527         encoder->protected_->max_residual_partition_order = 0;
1528         encoder->protected_->rice_parameter_search_dist = 0;
1529         encoder->protected_->total_samples_estimate = 0;
1530         encoder->protected_->metadata = 0;
1531         encoder->protected_->num_metadata_blocks = 0;
1532
1533         encoder->private_->disable_constant_subframes = false;
1534         encoder->private_->disable_fixed_subframes = false;
1535         encoder->private_->disable_verbatim_subframes = false;
1536         encoder->private_->write_callback = 0;
1537         encoder->private_->metadata_callback = 0;
1538         encoder->private_->client_data = 0;
1539 }
1540
1541 void free_(FLAC__StreamEncoder *encoder)
1542 {
1543         unsigned i, channel;
1544
1545         FLAC__ASSERT(0 != encoder);
1546         for(i = 0; i < encoder->protected_->channels; i++) {
1547                 if(0 != encoder->private_->integer_signal_unaligned[i]) {
1548                         free(encoder->private_->integer_signal_unaligned[i]);
1549                         encoder->private_->integer_signal_unaligned[i] = 0;
1550                 }
1551 #ifndef FLAC__INTEGER_ONLY_LIBRARY
1552                 if(0 != encoder->private_->real_signal_unaligned[i]) {
1553                         free(encoder->private_->real_signal_unaligned[i]);
1554                         encoder->private_->real_signal_unaligned[i] = 0;
1555                 }
1556 #endif
1557         }
1558         for(i = 0; i < 2; i++) {
1559                 if(0 != encoder->private_->integer_signal_mid_side_unaligned[i]) {
1560                         free(encoder->private_->integer_signal_mid_side_unaligned[i]);
1561                         encoder->private_->integer_signal_mid_side_unaligned[i] = 0;
1562                 }
1563 #ifndef FLAC__INTEGER_ONLY_LIBRARY
1564                 if(0 != encoder->private_->real_signal_mid_side_unaligned[i]) {
1565                         free(encoder->private_->real_signal_mid_side_unaligned[i]);
1566                         encoder->private_->real_signal_mid_side_unaligned[i] = 0;
1567                 }
1568 #endif
1569         }
1570         for(channel = 0; channel < encoder->protected_->channels; channel++) {
1571                 for(i = 0; i < 2; i++) {
1572                         if(0 != encoder->private_->residual_workspace_unaligned[channel][i]) {
1573                                 free(encoder->private_->residual_workspace_unaligned[channel][i]);
1574                                 encoder->private_->residual_workspace_unaligned[channel][i] = 0;
1575                         }
1576                 }
1577         }
1578         for(channel = 0; channel < 2; channel++) {
1579                 for(i = 0; i < 2; i++) {
1580                         if(0 != encoder->private_->residual_workspace_mid_side_unaligned[channel][i]) {
1581                                 free(encoder->private_->residual_workspace_mid_side_unaligned[channel][i]);
1582                                 encoder->private_->residual_workspace_mid_side_unaligned[channel][i] = 0;
1583                         }
1584                 }
1585         }
1586         if(0 != encoder->private_->abs_residual_unaligned) {
1587                 free(encoder->private_->abs_residual_unaligned);
1588                 encoder->private_->abs_residual_unaligned = 0;
1589         }
1590         if(0 != encoder->private_->abs_residual_partition_sums_unaligned) {
1591                 free(encoder->private_->abs_residual_partition_sums_unaligned);
1592                 encoder->private_->abs_residual_partition_sums_unaligned = 0;
1593         }
1594         if(0 != encoder->private_->raw_bits_per_partition_unaligned) {
1595                 free(encoder->private_->raw_bits_per_partition_unaligned);
1596                 encoder->private_->raw_bits_per_partition_unaligned = 0;
1597         }
1598         if(encoder->protected_->verify) {
1599                 for(i = 0; i < encoder->protected_->channels; i++) {
1600                         if(0 != encoder->private_->verify.input_fifo.data[i]) {
1601                                 free(encoder->private_->verify.input_fifo.data[i]);
1602                                 encoder->private_->verify.input_fifo.data[i] = 0;
1603                         }
1604                 }
1605         }
1606         FLAC__bitbuffer_free(encoder->private_->frame);
1607 }
1608
1609 FLAC__bool resize_buffers_(FLAC__StreamEncoder *encoder, unsigned new_size)
1610 {
1611         FLAC__bool ok;
1612         unsigned i, channel;
1613
1614         FLAC__ASSERT(new_size > 0);
1615         FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK);
1616         FLAC__ASSERT(encoder->private_->current_sample_number == 0);
1617
1618         /* To avoid excessive malloc'ing, we only grow the buffer; no shrinking. */
1619         if(new_size <= encoder->private_->input_capacity)
1620                 return true;
1621
1622         ok = true;
1623
1624         /* WATCHOUT: FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx()
1625          * requires that the input arrays (in our case the integer signals)
1626          * have a buffer of up to 3 zeroes in front (at negative indices) for
1627          * alignment purposes; we use 4 to keep the data well-aligned.
1628          */
1629
1630         for(i = 0; ok && i < encoder->protected_->channels; i++) {
1631                 ok = ok && FLAC__memory_alloc_aligned_int32_array(new_size+4, &encoder->private_->integer_signal_unaligned[i], &encoder->private_->integer_signal[i]);
1632 #ifndef FLAC__INTEGER_ONLY_LIBRARY
1633                 ok = ok && FLAC__memory_alloc_aligned_real_array(new_size, &encoder->private_->real_signal_unaligned[i], &encoder->private_->real_signal[i]);
1634 #endif
1635                 memset(encoder->private_->integer_signal[i], 0, sizeof(FLAC__int32)*4);
1636                 encoder->private_->integer_signal[i] += 4;
1637         }
1638         for(i = 0; ok && i < 2; i++) {
1639                 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]);
1640 #ifndef FLAC__INTEGER_ONLY_LIBRARY
1641                 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]);
1642 #endif
1643                 memset(encoder->private_->integer_signal_mid_side[i], 0, sizeof(FLAC__int32)*4);
1644                 encoder->private_->integer_signal_mid_side[i] += 4;
1645         }
1646         for(channel = 0; ok && channel < encoder->protected_->channels; channel++) {
1647                 for(i = 0; ok && i < 2; i++) {
1648                         ok = ok && FLAC__memory_alloc_aligned_int32_array(new_size, &encoder->private_->residual_workspace_unaligned[channel][i], &encoder->private_->residual_workspace[channel][i]);
1649                 }
1650         }
1651         for(channel = 0; ok && channel < 2; channel++) {
1652                 for(i = 0; ok && i < 2; i++) {
1653                         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]);
1654                 }
1655         }
1656         ok = ok && FLAC__memory_alloc_aligned_uint32_array(new_size, &encoder->private_->abs_residual_unaligned, &encoder->private_->abs_residual);
1657         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 */
1658                 ok = ok && FLAC__memory_alloc_aligned_uint64_array(new_size * 2, &encoder->private_->abs_residual_partition_sums_unaligned, &encoder->private_->abs_residual_partition_sums);
1659         if(encoder->protected_->do_escape_coding)
1660                 ok = ok && FLAC__memory_alloc_aligned_unsigned_array(new_size * 2, &encoder->private_->raw_bits_per_partition_unaligned, &encoder->private_->raw_bits_per_partition);
1661
1662         if(ok)
1663                 encoder->private_->input_capacity = new_size;
1664         else
1665                 encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
1666
1667         return ok;
1668 }
1669
1670 FLAC__bool write_bitbuffer_(FLAC__StreamEncoder *encoder, unsigned samples)
1671 {
1672         const FLAC__byte *buffer;
1673         unsigned bytes;
1674
1675         FLAC__ASSERT(FLAC__bitbuffer_is_byte_aligned(encoder->private_->frame));
1676
1677         FLAC__bitbuffer_get_buffer(encoder->private_->frame, &buffer, &bytes);
1678
1679         if(encoder->protected_->verify) {
1680                 encoder->private_->verify.output.data = buffer;
1681                 encoder->private_->verify.output.bytes = bytes;
1682                 if(encoder->private_->verify.state_hint == ENCODER_IN_MAGIC) {
1683                         encoder->private_->verify.needs_magic_hack = true;
1684                 }
1685                 else {
1686                         if(!FLAC__stream_decoder_process_single(encoder->private_->verify.decoder)) {
1687                                 FLAC__bitbuffer_release_buffer(encoder->private_->frame);
1688                                 if(encoder->protected_->state != FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA)
1689                                         encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR;
1690                                 return false;
1691                         }
1692                 }
1693         }
1694
1695         if(encoder->private_->write_callback(encoder, buffer, bytes, samples, encoder->private_->current_frame_number, encoder->private_->client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) {
1696                 FLAC__bitbuffer_release_buffer(encoder->private_->frame);
1697                 encoder->protected_->state = FLAC__STREAM_ENCODER_FATAL_ERROR_WHILE_WRITING;
1698                 return false;
1699         }
1700
1701         FLAC__bitbuffer_release_buffer(encoder->private_->frame);
1702
1703         if(samples > 0) {
1704                 encoder->private_->metadata.data.stream_info.min_framesize = min(bytes, encoder->private_->metadata.data.stream_info.min_framesize);
1705                 encoder->private_->metadata.data.stream_info.max_framesize = max(bytes, encoder->private_->metadata.data.stream_info.max_framesize);
1706         }
1707
1708         return true;
1709 }
1710
1711 FLAC__bool process_frame_(FLAC__StreamEncoder *encoder, FLAC__bool is_last_frame)
1712 {
1713         FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK);
1714
1715         /*
1716          * Accumulate raw signal to the MD5 signature
1717          */
1718         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)) {
1719                 encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
1720                 return false;
1721         }
1722
1723         /*
1724          * Process the frame header and subframes into the frame bitbuffer
1725          */
1726         if(!process_subframes_(encoder, is_last_frame)) {
1727                 /* the above function sets the state for us in case of an error */
1728                 return false;
1729         }
1730
1731         /*
1732          * Zero-pad the frame to a byte_boundary
1733          */
1734         if(!FLAC__bitbuffer_zero_pad_to_byte_boundary(encoder->private_->frame)) {
1735                 encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
1736                 return false;
1737         }
1738
1739         /*
1740          * CRC-16 the whole thing
1741          */
1742         FLAC__ASSERT(FLAC__bitbuffer_is_byte_aligned(encoder->private_->frame));
1743         FLAC__bitbuffer_write_raw_uint32(encoder->private_->frame, FLAC__bitbuffer_get_write_crc16(encoder->private_->frame), FLAC__FRAME_FOOTER_CRC_LEN);
1744
1745         /*
1746          * Write it
1747          */
1748         if(!write_bitbuffer_(encoder, encoder->protected_->blocksize)) {
1749                 /* the above function sets the state for us in case of an error */
1750                 return false;
1751         }
1752
1753         /*
1754          * Get ready for the next frame
1755          */
1756         encoder->private_->current_sample_number = 0;
1757         encoder->private_->current_frame_number++;
1758         encoder->private_->metadata.data.stream_info.total_samples += (FLAC__uint64)encoder->protected_->blocksize;
1759
1760         return true;
1761 }
1762
1763 FLAC__bool process_subframes_(FLAC__StreamEncoder *encoder, FLAC__bool is_last_frame)
1764 {
1765         FLAC__FrameHeader frame_header;
1766         unsigned channel, min_partition_order = encoder->protected_->min_residual_partition_order, max_partition_order;
1767         FLAC__bool do_independent, do_mid_side, precompute_partition_sums;
1768
1769         /*
1770          * Calculate the min,max Rice partition orders
1771          */
1772         if(is_last_frame) {
1773                 max_partition_order = 0;
1774         }
1775         else {
1776                 max_partition_order = FLAC__format_get_max_rice_partition_order_from_blocksize(encoder->protected_->blocksize);
1777                 max_partition_order = min(max_partition_order, encoder->protected_->max_residual_partition_order);
1778         }
1779         min_partition_order = min(min_partition_order, max_partition_order);
1780
1781         precompute_partition_sums = encoder->private_->precompute_partition_sums && ((max_partition_order > min_partition_order) || encoder->protected_->do_escape_coding);
1782
1783         /*
1784          * Setup the frame
1785          */
1786         if(!FLAC__bitbuffer_clear(encoder->private_->frame)) {
1787                 encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
1788                 return false;
1789         }
1790         frame_header.blocksize = encoder->protected_->blocksize;
1791         frame_header.sample_rate = encoder->protected_->sample_rate;
1792         frame_header.channels = encoder->protected_->channels;
1793         frame_header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT; /* the default unless the encoder determines otherwise */
1794         frame_header.bits_per_sample = encoder->protected_->bits_per_sample;
1795         frame_header.number_type = FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER;
1796         frame_header.number.frame_number = encoder->private_->current_frame_number;
1797
1798         /*
1799          * Figure out what channel assignments to try
1800          */
1801         if(encoder->protected_->do_mid_side_stereo) {
1802                 if(encoder->protected_->loose_mid_side_stereo) {
1803                         if(encoder->private_->loose_mid_side_stereo_frame_count == 0) {
1804                                 do_independent = true;
1805                                 do_mid_side = true;
1806                         }
1807                         else {
1808                                 do_independent = (encoder->private_->last_channel_assignment == FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT);
1809                                 do_mid_side = !do_independent;
1810                         }
1811                 }
1812                 else {
1813                         do_independent = true;
1814                         do_mid_side = true;
1815                 }
1816         }
1817         else {
1818                 do_independent = true;
1819                 do_mid_side = false;
1820         }
1821
1822         FLAC__ASSERT(do_independent || do_mid_side);
1823
1824         /*
1825          * Check for wasted bits; set effective bps for each subframe
1826          */
1827         if(do_independent) {
1828                 for(channel = 0; channel < encoder->protected_->channels; channel++) {
1829                         const unsigned w = get_wasted_bits_(encoder->private_->integer_signal[channel], encoder->protected_->blocksize);
1830                         encoder->private_->subframe_workspace[channel][0].wasted_bits = encoder->private_->subframe_workspace[channel][1].wasted_bits = w;
1831                         encoder->private_->subframe_bps[channel] = encoder->protected_->bits_per_sample - w;
1832                 }
1833         }
1834         if(do_mid_side) {
1835                 FLAC__ASSERT(encoder->protected_->channels == 2);
1836                 for(channel = 0; channel < 2; channel++) {
1837                         const unsigned w = get_wasted_bits_(encoder->private_->integer_signal_mid_side[channel], encoder->protected_->blocksize);
1838                         encoder->private_->subframe_workspace_mid_side[channel][0].wasted_bits = encoder->private_->subframe_workspace_mid_side[channel][1].wasted_bits = w;
1839                         encoder->private_->subframe_bps_mid_side[channel] = encoder->protected_->bits_per_sample - w + (channel==0? 0:1);
1840                 }
1841         }
1842
1843         /*
1844          * First do a normal encoding pass of each independent channel
1845          */
1846         if(do_independent) {
1847                 for(channel = 0; channel < encoder->protected_->channels; channel++) {
1848                         if(!
1849                                 process_subframe_(
1850                                         encoder,
1851                                         min_partition_order,
1852                                         max_partition_order,
1853                                         precompute_partition_sums,
1854                                         &frame_header,
1855                                         encoder->private_->subframe_bps[channel],
1856                                         encoder->private_->integer_signal[channel],
1857 #ifndef FLAC__INTEGER_ONLY_LIBRARY
1858                                         encoder->private_->real_signal[channel],
1859 #endif
1860                                         encoder->private_->subframe_workspace_ptr[channel],
1861                                         encoder->private_->partitioned_rice_contents_workspace_ptr[channel],
1862                                         encoder->private_->residual_workspace[channel],
1863                                         encoder->private_->best_subframe+channel,
1864                                         encoder->private_->best_subframe_bits+channel
1865                                 )
1866                         )
1867                                 return false;
1868                 }
1869         }
1870
1871         /*
1872          * Now do mid and side channels if requested
1873          */
1874         if(do_mid_side) {
1875                 FLAC__ASSERT(encoder->protected_->channels == 2);
1876
1877                 for(channel = 0; channel < 2; channel++) {
1878                         if(!
1879                                 process_subframe_(
1880                                         encoder,
1881                                         min_partition_order,
1882                                         max_partition_order,
1883                                         precompute_partition_sums,
1884                                         &frame_header,
1885                                         encoder->private_->subframe_bps_mid_side[channel],
1886                                         encoder->private_->integer_signal_mid_side[channel],
1887 #ifndef FLAC__INTEGER_ONLY_LIBRARY
1888                                         encoder->private_->real_signal_mid_side[channel],
1889 #endif
1890                                         encoder->private_->subframe_workspace_ptr_mid_side[channel],
1891                                         encoder->private_->partitioned_rice_contents_workspace_ptr_mid_side[channel],
1892                                         encoder->private_->residual_workspace_mid_side[channel],
1893                                         encoder->private_->best_subframe_mid_side+channel,
1894                                         encoder->private_->best_subframe_bits_mid_side+channel
1895                                 )
1896                         )
1897                                 return false;
1898                 }
1899         }
1900
1901         /*
1902          * Compose the frame bitbuffer
1903          */
1904         if(do_mid_side) {
1905                 unsigned left_bps = 0, right_bps = 0; /* initialized only to prevent superfluous compiler warning */
1906                 FLAC__Subframe *left_subframe = 0, *right_subframe = 0; /* initialized only to prevent superfluous compiler warning */
1907                 FLAC__ChannelAssignment channel_assignment;
1908
1909                 FLAC__ASSERT(encoder->protected_->channels == 2);
1910
1911                 if(encoder->protected_->loose_mid_side_stereo && encoder->private_->loose_mid_side_stereo_frame_count > 0) {
1912                         channel_assignment = (encoder->private_->last_channel_assignment == FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT? FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT : FLAC__CHANNEL_ASSIGNMENT_MID_SIDE);
1913                 }
1914                 else {
1915                         unsigned bits[4]; /* WATCHOUT - indexed by FLAC__ChannelAssignment */
1916                         unsigned min_bits;
1917                         FLAC__ChannelAssignment ca;
1918
1919                         FLAC__ASSERT(do_independent && do_mid_side);
1920
1921                         /* We have to figure out which channel assignent results in the smallest frame */
1922                         bits[FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT] = encoder->private_->best_subframe_bits         [0] + encoder->private_->best_subframe_bits         [1];
1923                         bits[FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE  ] = encoder->private_->best_subframe_bits         [0] + encoder->private_->best_subframe_bits_mid_side[1];
1924                         bits[FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE ] = encoder->private_->best_subframe_bits         [1] + encoder->private_->best_subframe_bits_mid_side[1];
1925                         bits[FLAC__CHANNEL_ASSIGNMENT_MID_SIDE   ] = encoder->private_->best_subframe_bits_mid_side[0] + encoder->private_->best_subframe_bits_mid_side[1];
1926
1927                         for(channel_assignment = (FLAC__ChannelAssignment)0, min_bits = bits[0], ca = (FLAC__ChannelAssignment)1; (int)ca <= 3; ca = (FLAC__ChannelAssignment)((int)ca + 1)) {
1928                                 if(bits[ca] < min_bits) {
1929                                         min_bits = bits[ca];
1930                                         channel_assignment = ca;
1931                                 }
1932                         }
1933                 }
1934
1935                 frame_header.channel_assignment = channel_assignment;
1936
1937                 if(!FLAC__frame_add_header(&frame_header, encoder->protected_->streamable_subset, encoder->private_->frame)) {
1938                         encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
1939                         return false;
1940                 }
1941
1942                 switch(channel_assignment) {
1943                         case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT:
1944                                 left_subframe  = &encoder->private_->subframe_workspace         [0][encoder->private_->best_subframe         [0]];
1945                                 right_subframe = &encoder->private_->subframe_workspace         [1][encoder->private_->best_subframe         [1]];
1946                                 break;
1947                         case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE:
1948                                 left_subframe  = &encoder->private_->subframe_workspace         [0][encoder->private_->best_subframe         [0]];
1949                                 right_subframe = &encoder->private_->subframe_workspace_mid_side[1][encoder->private_->best_subframe_mid_side[1]];
1950                                 break;
1951                         case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE:
1952                                 left_subframe  = &encoder->private_->subframe_workspace_mid_side[1][encoder->private_->best_subframe_mid_side[1]];
1953                                 right_subframe = &encoder->private_->subframe_workspace         [1][encoder->private_->best_subframe         [1]];
1954                                 break;
1955                         case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE:
1956                                 left_subframe  = &encoder->private_->subframe_workspace_mid_side[0][encoder->private_->best_subframe_mid_side[0]];
1957                                 right_subframe = &encoder->private_->subframe_workspace_mid_side[1][encoder->private_->best_subframe_mid_side[1]];
1958                                 break;
1959                         default:
1960                                 FLAC__ASSERT(0);
1961                 }
1962
1963                 switch(channel_assignment) {
1964                         case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT:
1965                                 left_bps  = encoder->private_->subframe_bps         [0];
1966                                 right_bps = encoder->private_->subframe_bps         [1];
1967                                 break;
1968                         case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE:
1969                                 left_bps  = encoder->private_->subframe_bps         [0];
1970                                 right_bps = encoder->private_->subframe_bps_mid_side[1];
1971                                 break;
1972                         case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE:
1973                                 left_bps  = encoder->private_->subframe_bps_mid_side[1];
1974                                 right_bps = encoder->private_->subframe_bps         [1];
1975                                 break;
1976                         case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE:
1977                                 left_bps  = encoder->private_->subframe_bps_mid_side[0];
1978                                 right_bps = encoder->private_->subframe_bps_mid_side[1];
1979                                 break;
1980                         default:
1981                                 FLAC__ASSERT(0);
1982                 }
1983
1984                 /* note that encoder_add_subframe_ sets the state for us in case of an error */
1985                 if(!add_subframe_(encoder, &frame_header, left_bps , left_subframe , encoder->private_->frame))
1986                         return false;
1987                 if(!add_subframe_(encoder, &frame_header, right_bps, right_subframe, encoder->private_->frame))
1988                         return false;
1989         }
1990         else {
1991                 if(!FLAC__frame_add_header(&frame_header, encoder->protected_->streamable_subset, encoder->private_->frame)) {
1992                         encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
1993                         return false;
1994                 }
1995
1996                 for(channel = 0; channel < encoder->protected_->channels; channel++) {
1997                         if(!add_subframe_(encoder, &frame_header, encoder->private_->subframe_bps[channel], &encoder->private_->subframe_workspace[channel][encoder->private_->best_subframe[channel]], encoder->private_->frame)) {
1998                                 /* the above function sets the state for us in case of an error */
1999                                 return false;
2000                         }
2001                 }
2002         }
2003
2004         if(encoder->protected_->loose_mid_side_stereo) {
2005                 encoder->private_->loose_mid_side_stereo_frame_count++;
2006                 if(encoder->private_->loose_mid_side_stereo_frame_count >= encoder->private_->loose_mid_side_stereo_frames)
2007                         encoder->private_->loose_mid_side_stereo_frame_count = 0;
2008         }
2009
2010         encoder->private_->last_channel_assignment = frame_header.channel_assignment;
2011
2012         return true;
2013 }
2014
2015 FLAC__bool process_subframe_(
2016         FLAC__StreamEncoder *encoder,
2017         unsigned min_partition_order,
2018         unsigned max_partition_order,
2019         FLAC__bool precompute_partition_sums,
2020         const FLAC__FrameHeader *frame_header,
2021         unsigned subframe_bps,
2022         const FLAC__int32 integer_signal[],
2023 #ifndef FLAC__INTEGER_ONLY_LIBRARY
2024         const FLAC__real real_signal[],
2025 #endif
2026         FLAC__Subframe *subframe[2],
2027         FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents[2],
2028         FLAC__int32 *residual[2],
2029         unsigned *best_subframe,
2030         unsigned *best_bits
2031 )
2032 {
2033 #ifndef FLAC__INTEGER_ONLY_LIBRARY
2034         FLAC__float fixed_residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1];
2035 #else
2036         FLAC__fixedpoint fixed_residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1];
2037 #endif
2038 #ifndef FLAC__INTEGER_ONLY_LIBRARY
2039         FLAC__double lpc_residual_bits_per_sample;
2040         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 */
2041         FLAC__double lpc_error[FLAC__MAX_LPC_ORDER];
2042         unsigned min_lpc_order, max_lpc_order, lpc_order;
2043         unsigned min_qlp_coeff_precision, max_qlp_coeff_precision, qlp_coeff_precision;
2044 #endif
2045         unsigned min_fixed_order, max_fixed_order, guess_fixed_order, fixed_order;
2046         unsigned rice_parameter;
2047         unsigned _candidate_bits, _best_bits;
2048         unsigned _best_subframe;
2049
2050         /* verbatim subframe is the baseline against which we measure other compressed subframes */
2051         _best_subframe = 0;
2052         if(encoder->private_->disable_verbatim_subframes && frame_header->blocksize >= FLAC__MAX_FIXED_ORDER)
2053                 _best_bits = UINT_MAX;
2054         else
2055                 _best_bits = evaluate_verbatim_subframe_(integer_signal, frame_header->blocksize, subframe_bps, subframe[_best_subframe]);
2056
2057         if(frame_header->blocksize >= FLAC__MAX_FIXED_ORDER) {
2058                 unsigned signal_is_constant = false;
2059                 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);
2060                 /* check for constant subframe */
2061                 if(
2062                         !encoder->private_->disable_constant_subframes &&
2063 #ifndef FLAC__INTEGER_ONLY_LIBRARY
2064                         fixed_residual_bits_per_sample[1] == 0.0
2065 #else
2066                         fixed_residual_bits_per_sample[1] == FLAC__FP_ZERO
2067 #endif
2068                 ) {
2069                         /* the above means it's possible all samples are the same value; now double-check it: */
2070                         unsigned i;
2071                         signal_is_constant = true;
2072                         for(i = 1; i < frame_header->blocksize; i++) {
2073                                 if(integer_signal[0] != integer_signal[i]) {
2074                                         signal_is_constant = false;
2075                                         break;
2076                                 }
2077                         }
2078                 }
2079                 if(signal_is_constant) {
2080                         _candidate_bits = evaluate_constant_subframe_(integer_signal[0], subframe_bps, subframe[!_best_subframe]);
2081                         if(_candidate_bits < _best_bits) {
2082                                 _best_subframe = !_best_subframe;
2083                                 _best_bits = _candidate_bits;
2084                         }
2085                 }
2086                 else {
2087                         if(!encoder->private_->disable_fixed_subframes || (encoder->protected_->max_lpc_order == 0 && _best_bits == UINT_MAX)) {
2088                                 /* encode fixed */
2089                                 if(encoder->protected_->do_exhaustive_model_search) {
2090                                         min_fixed_order = 0;
2091                                         max_fixed_order = FLAC__MAX_FIXED_ORDER;
2092                                 }
2093                                 else {
2094                                         min_fixed_order = max_fixed_order = guess_fixed_order;
2095                                 }
2096                                 for(fixed_order = min_fixed_order; fixed_order <= max_fixed_order; fixed_order++) {
2097 #ifndef FLAC__INTEGER_ONLY_LIBRARY
2098                                         if(fixed_residual_bits_per_sample[fixed_order] >= (FLAC__float)subframe_bps)
2099                                                 continue; /* don't even try */
2100                                         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 */
2101 #else
2102                                         if(FLAC__fixedpoint_trunc(fixed_residual_bits_per_sample[fixed_order]) >= (int)subframe_bps)
2103                                                 continue; /* don't even try */
2104                                         rice_parameter = (fixed_residual_bits_per_sample[fixed_order] > FLAC__FP_ZERO)? (unsigned)FLAC__fixedpoint_trunc(fixed_residual_bits_per_sample[fixed_order]+FLAC__FP_ONE_HALF) : 0; /* 0.5 is for rounding */
2105 #endif
2106 #ifndef FLAC__SYMMETRIC_RICE
2107                                         rice_parameter++; /* to account for the signed->unsigned conversion during rice coding */
2108 #endif
2109                                         if(rice_parameter >= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER) {
2110 #ifdef DEBUG_VERBOSE
2111                                                 fprintf(stderr, "clipping rice_parameter (%u -> %u) @0\n", rice_parameter, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1);
2112 #endif
2113                                                 rice_parameter = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1;
2114                                         }
2115                                         _candidate_bits =
2116                                                 evaluate_fixed_subframe_(
2117                                                         encoder,
2118                                                         integer_signal,
2119                                                         residual[!_best_subframe],
2120                                                         encoder->private_->abs_residual,
2121                                                         encoder->private_->abs_residual_partition_sums,
2122                                                         encoder->private_->raw_bits_per_partition,
2123                                                         frame_header->blocksize,
2124                                                         subframe_bps,
2125                                                         fixed_order,
2126                                                         rice_parameter,
2127                                                         min_partition_order,
2128                                                         max_partition_order,
2129                                                         precompute_partition_sums,
2130                                                         encoder->protected_->do_escape_coding,
2131                                                         encoder->protected_->rice_parameter_search_dist,
2132                                                         subframe[!_best_subframe],
2133                                                         partitioned_rice_contents[!_best_subframe]
2134                                                 );
2135                                         if(_candidate_bits < _best_bits) {
2136                                                 _best_subframe = !_best_subframe;
2137                                                 _best_bits = _candidate_bits;
2138                                         }
2139                                 }
2140                         }
2141
2142 #ifndef FLAC__INTEGER_ONLY_LIBRARY
2143                         /* encode lpc */
2144                         if(encoder->protected_->max_lpc_order > 0) {
2145                                 if(encoder->protected_->max_lpc_order >= frame_header->blocksize)
2146                                         max_lpc_order = frame_header->blocksize-1;
2147                                 else
2148                                         max_lpc_order = encoder->protected_->max_lpc_order;
2149                                 if(max_lpc_order > 0) {
2150                                         encoder->private_->local_lpc_compute_autocorrelation(real_signal, frame_header->blocksize, max_lpc_order+1, autoc);
2151                                         /* if autoc[0] == 0.0, the signal is constant and we usually won't get here, but it can happen */
2152                                         if(autoc[0] != 0.0) {
2153                                                 FLAC__lpc_compute_lp_coefficients(autoc, max_lpc_order, encoder->private_->lp_coeff, lpc_error);
2154                                                 if(encoder->protected_->do_exhaustive_model_search) {
2155                                                         min_lpc_order = 1;
2156                                                 }
2157                                                 else {
2158                                                         unsigned guess_lpc_order = FLAC__lpc_compute_best_order(lpc_error, max_lpc_order, frame_header->blocksize, subframe_bps);
2159                                                         min_lpc_order = max_lpc_order = guess_lpc_order;
2160                                                 }
2161                                                 for(lpc_order = min_lpc_order; lpc_order <= max_lpc_order; lpc_order++) {
2162                                                         lpc_residual_bits_per_sample = FLAC__lpc_compute_expected_bits_per_residual_sample(lpc_error[lpc_order-1], frame_header->blocksize-lpc_order);
2163                                                         if(lpc_residual_bits_per_sample >= (FLAC__double)subframe_bps)
2164                                                                 continue; /* don't even try */
2165                                                         rice_parameter = (lpc_residual_bits_per_sample > 0.0)? (unsigned)(lpc_residual_bits_per_sample+0.5) : 0; /* 0.5 is for rounding */
2166 #ifndef FLAC__SYMMETRIC_RICE
2167                                                         rice_parameter++; /* to account for the signed->unsigned conversion during rice coding */
2168 #endif
2169                                                         if(rice_parameter >= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER) {
2170 #ifdef DEBUG_VERBOSE
2171                                                                 fprintf(stderr, "clipping rice_parameter (%u -> %u) @1\n", rice_parameter, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1);
2172 #endif
2173                                                                 rice_parameter = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1;
2174                                                         }
2175                                                         if(encoder->protected_->do_qlp_coeff_prec_search) {
2176                                                                 min_qlp_coeff_precision = FLAC__MIN_QLP_COEFF_PRECISION;
2177                                                                 /* ensure a 32-bit datapath throughout for 16bps or less */
2178                                                                 if(subframe_bps <= 16)
2179                                                                         max_qlp_coeff_precision = min(32 - subframe_bps - lpc_order, FLAC__MAX_QLP_COEFF_PRECISION);
2180                                                                 else
2181                                                                         max_qlp_coeff_precision = FLAC__MAX_QLP_COEFF_PRECISION;
2182                                                         }
2183                                                         else {
2184                                                                 min_qlp_coeff_precision = max_qlp_coeff_precision = encoder->protected_->qlp_coeff_precision;
2185                                                         }
2186                                                         for(qlp_coeff_precision = min_qlp_coeff_precision; qlp_coeff_precision <= max_qlp_coeff_precision; qlp_coeff_precision++) {
2187                                                                 _candidate_bits =
2188                                                                         evaluate_lpc_subframe_(
2189                                                                                 encoder,
2190                                                                                 integer_signal,
2191                                                                                 residual[!_best_subframe],
2192                                                                                 encoder->private_->abs_residual,
2193                                                                                 encoder->private_->abs_residual_partition_sums,
2194                                                                                 encoder->private_->raw_bits_per_partition,
2195                                                                                 encoder->private_->lp_coeff[lpc_order-1],
2196                                                                                 frame_header->blocksize,
2197                                                                                 subframe_bps,
2198                                                                                 lpc_order,
2199                                                                                 qlp_coeff_precision,
2200                                                                                 rice_parameter,
2201                                                                                 min_partition_order,
2202                                                                                 max_partition_order,
2203                                                                                 precompute_partition_sums,
2204                                                                                 encoder->protected_->do_escape_coding,
2205                                                                                 encoder->protected_->rice_parameter_search_dist,
2206                                                                                 subframe[!_best_subframe],
2207                                                                                 partitioned_rice_contents[!_best_subframe]
2208                                                                         );
2209                                                                 if(_candidate_bits > 0) { /* if == 0, there was a problem quantizing the lpcoeffs */
2210                                                                         if(_candidate_bits < _best_bits) {
2211                                                                                 _best_subframe = !_best_subframe;
2212                                                                                 _best_bits = _candidate_bits;
2213                                                                         }
2214                                                                 }
2215                                                         }
2216                                                 }
2217                                         }
2218                                 }
2219                         }
2220 #endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */
2221                 }
2222         }
2223
2224         /* under rare circumstances this can happen when all but lpc subframe types are disabled: */
2225         if(_best_bits == UINT_MAX) {
2226                 FLAC__ASSERT(_best_subframe == 0);
2227                 _best_bits = evaluate_verbatim_subframe_(integer_signal, frame_header->blocksize, subframe_bps, subframe[_best_subframe]);
2228         }
2229
2230         *best_subframe = _best_subframe;
2231         *best_bits = _best_bits;
2232
2233         return true;
2234 }
2235
2236 FLAC__bool add_subframe_(
2237         FLAC__StreamEncoder *encoder,
2238         const FLAC__FrameHeader *frame_header,
2239         unsigned subframe_bps,
2240         const FLAC__Subframe *subframe,
2241         FLAC__BitBuffer *frame
2242 )
2243 {
2244         switch(subframe->type) {
2245                 case FLAC__SUBFRAME_TYPE_CONSTANT:
2246                         if(!FLAC__subframe_add_constant(&(subframe->data.constant), subframe_bps, subframe->wasted_bits, frame)) {
2247                                 encoder->protected_->state = FLAC__STREAM_ENCODER_FATAL_ERROR_WHILE_ENCODING;
2248                                 return false;
2249                         }
2250                         break;
2251                 case FLAC__SUBFRAME_TYPE_FIXED:
2252                         if(!FLAC__subframe_add_fixed(&(subframe->data.fixed), frame_header->blocksize - subframe->data.fixed.order, subframe_bps, subframe->wasted_bits, frame)) {
2253                                 encoder->protected_->state = FLAC__STREAM_ENCODER_FATAL_ERROR_WHILE_ENCODING;
2254                                 return false;
2255                         }
2256                         break;
2257                 case FLAC__SUBFRAME_TYPE_LPC:
2258                         if(!FLAC__subframe_add_lpc(&(subframe->data.lpc), frame_header->blocksize - subframe->data.lpc.order, subframe_bps, subframe->wasted_bits, frame)) {
2259                                 encoder->protected_->state = FLAC__STREAM_ENCODER_FATAL_ERROR_WHILE_ENCODING;
2260                                 return false;
2261                         }
2262                         break;
2263                 case FLAC__SUBFRAME_TYPE_VERBATIM:
2264                         if(!FLAC__subframe_add_verbatim(&(subframe->data.verbatim), frame_header->blocksize, subframe_bps, subframe->wasted_bits, frame)) {
2265                                 encoder->protected_->state = FLAC__STREAM_ENCODER_FATAL_ERROR_WHILE_ENCODING;
2266                                 return false;
2267                         }
2268                         break;
2269                 default:
2270                         FLAC__ASSERT(0);
2271         }
2272
2273         return true;
2274 }
2275
2276 unsigned evaluate_constant_subframe_(
2277         const FLAC__int32 signal,
2278         unsigned subframe_bps,
2279         FLAC__Subframe *subframe
2280 )
2281 {
2282         subframe->type = FLAC__SUBFRAME_TYPE_CONSTANT;
2283         subframe->data.constant.value = signal;
2284
2285         return FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + subframe_bps;
2286 }
2287
2288 unsigned evaluate_fixed_subframe_(
2289         FLAC__StreamEncoder *encoder,
2290         const FLAC__int32 signal[],
2291         FLAC__int32 residual[],
2292         FLAC__uint32 abs_residual[],
2293         FLAC__uint64 abs_residual_partition_sums[],
2294         unsigned raw_bits_per_partition[],
2295         unsigned blocksize,
2296         unsigned subframe_bps,
2297         unsigned order,
2298         unsigned rice_parameter,
2299         unsigned min_partition_order,
2300         unsigned max_partition_order,
2301         FLAC__bool precompute_partition_sums,
2302         FLAC__bool do_escape_coding,
2303         unsigned rice_parameter_search_dist,
2304         FLAC__Subframe *subframe,
2305         FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents
2306 )
2307 {
2308         unsigned i, residual_bits;
2309         const unsigned residual_samples = blocksize - order;
2310
2311         FLAC__fixed_compute_residual(signal+order, residual_samples, order, residual);
2312
2313         subframe->type = FLAC__SUBFRAME_TYPE_FIXED;
2314
2315         subframe->data.fixed.entropy_coding_method.type = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE;
2316         subframe->data.fixed.entropy_coding_method.data.partitioned_rice.contents = partitioned_rice_contents;
2317         subframe->data.fixed.residual = residual;
2318
2319         residual_bits =
2320                 find_best_partition_order_(
2321                         encoder->private_,
2322                         residual,
2323                         abs_residual,
2324                         abs_residual_partition_sums,
2325                         raw_bits_per_partition,
2326                         residual_samples,
2327                         order,
2328                         rice_parameter,
2329                         min_partition_order,
2330                         max_partition_order,
2331                         precompute_partition_sums,
2332                         do_escape_coding,
2333                         rice_parameter_search_dist,
2334                         &subframe->data.fixed.entropy_coding_method.data.partitioned_rice
2335                 );
2336
2337         subframe->data.fixed.order = order;
2338         for(i = 0; i < order; i++)
2339                 subframe->data.fixed.warmup[i] = signal[i];
2340
2341         return FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + (order * subframe_bps) + residual_bits;
2342 }
2343
2344 #ifndef FLAC__INTEGER_ONLY_LIBRARY
2345 unsigned evaluate_lpc_subframe_(
2346         FLAC__StreamEncoder *encoder,
2347         const FLAC__int32 signal[],
2348         FLAC__int32 residual[],
2349         FLAC__uint32 abs_residual[],
2350         FLAC__uint64 abs_residual_partition_sums[],
2351         unsigned raw_bits_per_partition[],
2352         const FLAC__real lp_coeff[],
2353         unsigned blocksize,
2354         unsigned subframe_bps,
2355         unsigned order,
2356         unsigned qlp_coeff_precision,
2357         unsigned rice_parameter,
2358         unsigned min_partition_order,
2359         unsigned max_partition_order,
2360         FLAC__bool precompute_partition_sums,
2361         FLAC__bool do_escape_coding,
2362         unsigned rice_parameter_search_dist,
2363         FLAC__Subframe *subframe,
2364         FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents
2365 )
2366 {
2367         FLAC__int32 qlp_coeff[FLAC__MAX_LPC_ORDER];
2368         unsigned i, residual_bits;
2369         int quantization, ret;
2370         const unsigned residual_samples = blocksize - order;
2371
2372         /* try to keep qlp coeff precision such that only 32-bit math is required for decode of <=16bps streams */
2373         if(subframe_bps <= 16) {
2374                 FLAC__ASSERT(order > 0);
2375                 FLAC__ASSERT(order <= FLAC__MAX_LPC_ORDER);
2376                 qlp_coeff_precision = min(qlp_coeff_precision, 32 - subframe_bps - FLAC__bitmath_ilog2(order));
2377         }
2378
2379         ret = FLAC__lpc_quantize_coefficients(lp_coeff, order, qlp_coeff_precision, qlp_coeff, &quantization);
2380         if(ret != 0)
2381                 return 0; /* this is a hack to indicate to the caller that we can't do lp at this order on this subframe */
2382
2383         if(subframe_bps + qlp_coeff_precision + FLAC__bitmath_ilog2(order) <= 32)
2384                 if(subframe_bps <= 16 && qlp_coeff_precision <= 16)
2385                         encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit(signal+order, residual_samples, qlp_coeff, order, quantization, residual);
2386                 else
2387                         encoder->private_->local_lpc_compute_residual_from_qlp_coefficients(signal+order, residual_samples, qlp_coeff, order, quantization, residual);
2388         else
2389                 encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit(signal+order, residual_samples, qlp_coeff, order, quantization, residual);
2390
2391         subframe->type = FLAC__SUBFRAME_TYPE_LPC;
2392
2393         subframe->data.lpc.entropy_coding_method.type = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE;
2394         subframe->data.lpc.entropy_coding_method.data.partitioned_rice.contents = partitioned_rice_contents;
2395         subframe->data.lpc.residual = residual;
2396
2397         residual_bits =
2398                 find_best_partition_order_(
2399                         encoder->private_,
2400                         residual,
2401                         abs_residual,
2402                         abs_residual_partition_sums,
2403                         raw_bits_per_partition,
2404                         residual_samples,
2405                         order,
2406                         rice_parameter,
2407                         min_partition_order,
2408                         max_partition_order,
2409                         precompute_partition_sums,
2410                         do_escape_coding,
2411                         rice_parameter_search_dist,
2412                         &subframe->data.fixed.entropy_coding_method.data.partitioned_rice
2413                 );
2414
2415         subframe->data.lpc.order = order;
2416         subframe->data.lpc.qlp_coeff_precision = qlp_coeff_precision;
2417         subframe->data.lpc.quantization_level = quantization;
2418         memcpy(subframe->data.lpc.qlp_coeff, qlp_coeff, sizeof(FLAC__int32)*FLAC__MAX_LPC_ORDER);
2419         for(i = 0; i < order; i++)
2420                 subframe->data.lpc.warmup[i] = signal[i];
2421
2422         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;
2423 }
2424 #endif
2425
2426 unsigned evaluate_verbatim_subframe_(
2427         const FLAC__int32 signal[],
2428         unsigned blocksize,
2429         unsigned subframe_bps,
2430         FLAC__Subframe *subframe
2431 )
2432 {
2433         subframe->type = FLAC__SUBFRAME_TYPE_VERBATIM;
2434
2435         subframe->data.verbatim.data = signal;
2436
2437         return FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + (blocksize * subframe_bps);
2438 }
2439
2440 unsigned find_best_partition_order_(
2441         FLAC__StreamEncoderPrivate *private_,
2442         const FLAC__int32 residual[],
2443         FLAC__uint32 abs_residual[],
2444         FLAC__uint64 abs_residual_partition_sums[],
2445         unsigned raw_bits_per_partition[],
2446         unsigned residual_samples,
2447         unsigned predictor_order,
2448         unsigned rice_parameter,
2449         unsigned min_partition_order,
2450         unsigned max_partition_order,
2451         FLAC__bool precompute_partition_sums,
2452         FLAC__bool do_escape_coding,
2453         unsigned rice_parameter_search_dist,
2454         FLAC__EntropyCodingMethod_PartitionedRice *best_partitioned_rice
2455 )
2456 {
2457         FLAC__int32 r;
2458         unsigned residual_bits, best_residual_bits = 0;
2459         unsigned residual_sample;
2460         unsigned best_parameters_index = 0;
2461         const unsigned blocksize = residual_samples + predictor_order;
2462
2463         /* compute abs(residual) for use later */
2464         for(residual_sample = 0; residual_sample < residual_samples; residual_sample++) {
2465                 r = residual[residual_sample];
2466                 abs_residual[residual_sample] = (FLAC__uint32)(r<0? -r : r);
2467         }
2468
2469         max_partition_order = FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_and_predictor_order(max_partition_order, blocksize, predictor_order);
2470         min_partition_order = min(min_partition_order, max_partition_order);
2471
2472         if(precompute_partition_sums) {
2473                 int partition_order;
2474                 unsigned sum;
2475
2476                 precompute_partition_info_sums_(abs_residual, abs_residual_partition_sums, residual_samples, predictor_order, min_partition_order, max_partition_order);
2477
2478                 if(do_escape_coding)
2479                         precompute_partition_info_escapes_(residual, raw_bits_per_partition, residual_samples, predictor_order, min_partition_order, max_partition_order);
2480
2481                 for(partition_order = (int)max_partition_order, sum = 0; partition_order >= (int)min_partition_order; partition_order--) {
2482 #ifdef DONT_ESTIMATE_RICE_BITS
2483                         if(!
2484                                 set_partitioned_rice_with_precompute_(
2485                                         residual,
2486                                         abs_residual_partition_sums+sum,
2487                                         raw_bits_per_partition+sum,
2488                                         residual_samples,
2489                                         predictor_order,
2490                                         rice_parameter,
2491                                         rice_parameter_search_dist,
2492                                         (unsigned)partition_order,
2493                                         do_escape_coding,
2494                                         &private_->partitioned_rice_contents_extra[!best_parameters_index],
2495                                         &residual_bits
2496                                 )
2497                         )
2498 #else
2499                         if(!
2500                                 set_partitioned_rice_with_precompute_(
2501                                         abs_residual,
2502                                         abs_residual_partition_sums+sum,
2503                                         raw_bits_per_partition+sum,
2504                                         residual_samples,
2505                                         predictor_order,
2506                                         rice_parameter,
2507                                         rice_parameter_search_dist,
2508                                         (unsigned)partition_order,
2509                                         do_escape_coding,
2510                                         &private_->partitioned_rice_contents_extra[!best_parameters_index],
2511                                         &residual_bits
2512                                 )
2513                         )
2514 #endif
2515                         {
2516                                 FLAC__ASSERT(best_residual_bits != 0);
2517                                 break;
2518                         }
2519                         sum += 1u << partition_order;
2520                         if(best_residual_bits == 0 || residual_bits < best_residual_bits) {
2521                                 best_residual_bits = residual_bits;
2522                                 best_parameters_index = !best_parameters_index;
2523                                 best_partitioned_rice->order = partition_order;
2524                         }
2525                 }
2526         }
2527         else {
2528                 unsigned partition_order;
2529                 for(partition_order = min_partition_order; partition_order <= max_partition_order; partition_order++) {
2530 #ifdef DONT_ESTIMATE_RICE_BITS
2531                         if(!
2532                                 set_partitioned_rice_(
2533                                         abs_residual,
2534                                         residual,
2535                                         residual_samples,
2536                                         predictor_order,
2537                                         rice_parameter,
2538                                         rice_parameter_search_dist,
2539                                         partition_order,
2540                                         &private_->partitioned_rice_contents_extra[!best_parameters_index],
2541                                         &residual_bits
2542                                 )
2543                         )
2544 #else
2545                         if(!
2546                                 set_partitioned_rice_(
2547                                         abs_residual,
2548                                         residual_samples,
2549                                         predictor_order,
2550                                         rice_parameter,
2551                                         rice_parameter_search_dist,
2552                                         partition_order,
2553                                         &private_->partitioned_rice_contents_extra[!best_parameters_index],
2554                                         &residual_bits
2555                                 )
2556                         )
2557 #endif
2558                         {
2559                                 FLAC__ASSERT(best_residual_bits != 0);
2560                                 break;
2561                         }
2562                         if(best_residual_bits == 0 || residual_bits < best_residual_bits) {
2563                                 best_residual_bits = residual_bits;
2564                                 best_parameters_index = !best_parameters_index;
2565                                 best_partitioned_rice->order = partition_order;
2566                         }
2567                 }
2568         }
2569
2570         /*
2571          * We are allowed to de-const the pointer based on our special knowledge;
2572          * it is const to the outside world.
2573          */
2574         {
2575                 FLAC__EntropyCodingMethod_PartitionedRiceContents* best_partitioned_rice_contents = (FLAC__EntropyCodingMethod_PartitionedRiceContents*)best_partitioned_rice->contents;
2576                 FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(best_partitioned_rice_contents, max(6, best_partitioned_rice->order));
2577                 memcpy(best_partitioned_rice_contents->parameters, private_->partitioned_rice_contents_extra[best_parameters_index].parameters, sizeof(unsigned)*(1<<(best_partitioned_rice->order)));
2578                 memcpy(best_partitioned_rice_contents->raw_bits, private_->partitioned_rice_contents_extra[best_parameters_index].raw_bits, sizeof(unsigned)*(1<<(best_partitioned_rice->order)));
2579         }
2580
2581         return best_residual_bits;
2582 }
2583
2584 void precompute_partition_info_sums_(
2585         const FLAC__uint32 abs_residual[],
2586         FLAC__uint64 abs_residual_partition_sums[],
2587         unsigned residual_samples,
2588         unsigned predictor_order,
2589         unsigned min_partition_order,
2590         unsigned max_partition_order
2591 )
2592 {
2593         int partition_order;
2594         unsigned from_partition, to_partition = 0;
2595         const unsigned blocksize = residual_samples + predictor_order;
2596
2597         /* first do max_partition_order */
2598         for(partition_order = (int)max_partition_order; partition_order >= 0; partition_order--) {
2599                 FLAC__uint64 abs_residual_partition_sum;
2600                 FLAC__uint32 abs_r;
2601                 unsigned partition, partition_sample, partition_samples, residual_sample;
2602                 const unsigned partitions = 1u << partition_order;
2603                 const unsigned default_partition_samples = blocksize >> partition_order;
2604
2605                 FLAC__ASSERT(default_partition_samples > predictor_order);
2606
2607                 for(partition = residual_sample = 0; partition < partitions; partition++) {
2608                         partition_samples = default_partition_samples;
2609                         if(partition == 0)
2610                                 partition_samples -= predictor_order;
2611                         abs_residual_partition_sum = 0;
2612                         for(partition_sample = 0; partition_sample < partition_samples; partition_sample++) {
2613                                 abs_r = abs_residual[residual_sample];
2614                                 abs_residual_partition_sum += abs_r;
2615                                 residual_sample++;
2616                         }
2617                         abs_residual_partition_sums[partition] = abs_residual_partition_sum;
2618                 }
2619                 to_partition = partitions;
2620                 break;
2621         }
2622
2623         /* now merge partitions for lower orders */
2624         for(from_partition = 0, --partition_order; partition_order >= (int)min_partition_order; partition_order--) {
2625                 FLAC__uint64 s;
2626                 unsigned i;
2627                 const unsigned partitions = 1u << partition_order;
2628                 for(i = 0; i < partitions; i++) {
2629                         s = abs_residual_partition_sums[from_partition];
2630                         from_partition++;
2631                         abs_residual_partition_sums[to_partition] = s + abs_residual_partition_sums[from_partition];
2632                         from_partition++;
2633                         to_partition++;
2634                 }
2635         }
2636 }
2637
2638 void precompute_partition_info_escapes_(
2639         const FLAC__int32 residual[],
2640         unsigned raw_bits_per_partition[],
2641         unsigned residual_samples,
2642         unsigned predictor_order,
2643         unsigned min_partition_order,
2644         unsigned max_partition_order
2645 )
2646 {
2647         int partition_order;
2648         unsigned from_partition, to_partition = 0;
2649         const unsigned blocksize = residual_samples + predictor_order;
2650
2651         /* first do max_partition_order */
2652         for(partition_order = (int)max_partition_order; partition_order >= 0; partition_order--) {
2653                 FLAC__int32 r, residual_partition_min, residual_partition_max;
2654                 unsigned silog2_min, silog2_max;
2655                 unsigned partition, partition_sample, partition_samples, residual_sample;
2656                 const unsigned partitions = 1u << partition_order;
2657                 const unsigned default_partition_samples = blocksize >> partition_order;
2658
2659                 FLAC__ASSERT(default_partition_samples > predictor_order);
2660
2661                 for(partition = residual_sample = 0; partition < partitions; partition++) {
2662                         partition_samples = default_partition_samples;
2663                         if(partition == 0)
2664                                 partition_samples -= predictor_order;
2665                         residual_partition_min = residual_partition_max = 0;
2666                         for(partition_sample = 0; partition_sample < partition_samples; partition_sample++) {
2667                                 r = residual[residual_sample];
2668                                 if(r < residual_partition_min)
2669                                         residual_partition_min = r;
2670                                 else if(r > residual_partition_max)
2671                                         residual_partition_max = r;
2672                                 residual_sample++;
2673                         }
2674                         silog2_min = FLAC__bitmath_silog2(residual_partition_min);
2675                         silog2_max = FLAC__bitmath_silog2(residual_partition_max);
2676                         raw_bits_per_partition[partition] = max(silog2_min, silog2_max);
2677                 }
2678                 to_partition = partitions;
2679                 break;
2680         }
2681
2682         /* now merge partitions for lower orders */
2683         for(from_partition = 0, --partition_order; partition_order >= (int)min_partition_order; partition_order--) {
2684                 unsigned m;
2685                 unsigned i;
2686                 const unsigned partitions = 1u << partition_order;
2687                 for(i = 0; i < partitions; i++) {
2688                         m = raw_bits_per_partition[from_partition];
2689                         from_partition++;
2690                         raw_bits_per_partition[to_partition] = max(m, raw_bits_per_partition[from_partition]);
2691                         from_partition++;
2692                         to_partition++;
2693                 }
2694         }
2695 }
2696
2697 #ifdef VARIABLE_RICE_BITS
2698 #undef VARIABLE_RICE_BITS
2699 #endif
2700 #ifndef DONT_ESTIMATE_RICE_BITS
2701 #define VARIABLE_RICE_BITS(value, parameter) ((value) >> (parameter))
2702 #endif
2703
2704 #ifdef DONT_ESTIMATE_RICE_BITS
2705 FLAC__bool set_partitioned_rice_(
2706         const FLAC__uint32 abs_residual[],
2707         const FLAC__int32 residual[],
2708         const unsigned residual_samples,
2709         const unsigned predictor_order,
2710         const unsigned suggested_rice_parameter,
2711         const unsigned rice_parameter_search_dist,
2712         const unsigned partition_order,
2713         FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents,
2714         unsigned *bits
2715 )
2716 #else
2717 FLAC__bool set_partitioned_rice_(
2718         const FLAC__uint32 abs_residual[],
2719         const unsigned residual_samples,
2720         const unsigned predictor_order,
2721         const unsigned suggested_rice_parameter,
2722         const unsigned rice_parameter_search_dist,
2723         const unsigned partition_order,
2724         FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents,
2725         unsigned *bits
2726 )
2727 #endif
2728 {
2729         unsigned rice_parameter, partition_bits;
2730 #ifndef NO_RICE_SEARCH
2731         unsigned best_partition_bits;
2732         unsigned min_rice_parameter, max_rice_parameter, best_rice_parameter = 0;
2733 #endif
2734         unsigned bits_ = FLAC__ENTROPY_CODING_METHOD_TYPE_LEN + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN;
2735         unsigned *parameters;
2736
2737         FLAC__ASSERT(suggested_rice_parameter < FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER);
2738
2739         FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(partitioned_rice_contents, max(6, partition_order));
2740         parameters = partitioned_rice_contents->parameters;
2741
2742         if(partition_order == 0) {
2743                 unsigned i;
2744
2745 #ifndef NO_RICE_SEARCH
2746                 if(rice_parameter_search_dist) {
2747                         if(suggested_rice_parameter < rice_parameter_search_dist)
2748                                 min_rice_parameter = 0;
2749                         else
2750                                 min_rice_parameter = suggested_rice_parameter - rice_parameter_search_dist;
2751                         max_rice_parameter = suggested_rice_parameter + rice_parameter_search_dist;
2752                         if(max_rice_parameter >= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER) {
2753 #ifdef DEBUG_VERBOSE
2754                                 fprintf(stderr, "clipping rice_parameter (%u -> %u) @2\n", max_rice_parameter, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1);
2755 #endif
2756                                 max_rice_parameter = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1;
2757                         }
2758                 }
2759                 else
2760                         min_rice_parameter = max_rice_parameter = suggested_rice_parameter;
2761
2762                 best_partition_bits = 0xffffffff;
2763                 for(rice_parameter = min_rice_parameter; rice_parameter <= max_rice_parameter; rice_parameter++) {
2764 #endif
2765 #ifdef VARIABLE_RICE_BITS
2766 #ifdef FLAC__SYMMETRIC_RICE
2767                         partition_bits = (2+rice_parameter) * residual_samples;
2768 #else
2769                         const unsigned rice_parameter_estimate = rice_parameter-1;
2770                         partition_bits = (1+rice_parameter) * residual_samples;
2771 #endif
2772 #else
2773                         partition_bits = 0;
2774 #endif
2775                         partition_bits += FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN;
2776                         for(i = 0; i < residual_samples; i++) {
2777 #ifdef VARIABLE_RICE_BITS
2778 #ifdef FLAC__SYMMETRIC_RICE
2779                                 partition_bits += VARIABLE_RICE_BITS(abs_residual[i], rice_parameter);
2780 #else
2781                                 partition_bits += VARIABLE_RICE_BITS(abs_residual[i], rice_parameter_estimate);
2782 #endif
2783 #else
2784                                 partition_bits += FLAC__bitbuffer_rice_bits(residual[i], rice_parameter); /* NOTE: we will need to pass in residual[] in addition to abs_residual[] */
2785 #endif
2786                         }
2787 #ifndef NO_RICE_SEARCH
2788                         if(partition_bits < best_partition_bits) {
2789                                 best_rice_parameter = rice_parameter;
2790                                 best_partition_bits = partition_bits;
2791                         }
2792                 }
2793 #endif
2794                 parameters[0] = best_rice_parameter;
2795                 bits_ += best_partition_bits;
2796         }
2797         else {
2798                 unsigned partition, residual_sample, save_residual_sample, partition_sample;
2799                 unsigned partition_samples;
2800                 FLAC__uint64 mean, k;
2801                 const unsigned partitions = 1u << partition_order;
2802                 for(partition = residual_sample = 0; partition < partitions; partition++) {
2803                         partition_samples = (residual_samples+predictor_order) >> partition_order;
2804                         if(partition == 0) {
2805                                 if(partition_samples <= predictor_order)
2806                                         return false;
2807                                 else
2808                                         partition_samples -= predictor_order;
2809                         }
2810                         mean = 0;
2811                         save_residual_sample = residual_sample;
2812                         for(partition_sample = 0; partition_sample < partition_samples; residual_sample++, partition_sample++)
2813                                 mean += abs_residual[residual_sample];
2814                         residual_sample = save_residual_sample;
2815 #ifdef FLAC__SYMMETRIC_RICE
2816                         mean += partition_samples >> 1; /* for rounding effect */
2817                         mean /= partition_samples;
2818
2819                         /* calc rice_parameter = floor(log2(mean)) */
2820                         rice_parameter = 0;
2821                         mean>>=1;
2822                         while(mean) {
2823                                 rice_parameter++;
2824                                 mean >>= 1;
2825                         }
2826 #else
2827                         /* calc rice_parameter ala LOCO-I */
2828                         for(rice_parameter = 0, k = partition_samples; k < mean; rice_parameter++, k <<= 1)
2829                                 ;
2830 #endif
2831                         if(rice_parameter >= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER) {
2832 #ifdef DEBUG_VERBOSE
2833                                 fprintf(stderr, "clipping rice_parameter (%u -> %u) @3\n", rice_parameter, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1);
2834 #endif
2835                                 rice_parameter = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1;
2836                         }
2837
2838 #ifndef NO_RICE_SEARCH
2839                         if(rice_parameter_search_dist) {
2840                                 if(rice_parameter < rice_parameter_search_dist)
2841                                         min_rice_parameter = 0;
2842                                 else
2843                                         min_rice_parameter = rice_parameter - rice_parameter_search_dist;
2844                                 max_rice_parameter = rice_parameter + rice_parameter_search_dist;
2845                                 if(max_rice_parameter >= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER) {
2846 #ifdef DEBUG_VERBOSE
2847                                         fprintf(stderr, "clipping rice_parameter (%u -> %u) @4\n", max_rice_parameter, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1);
2848 #endif
2849                                         max_rice_parameter = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1;
2850                                 }
2851                         }
2852                         else
2853                                 min_rice_parameter = max_rice_parameter = rice_parameter;
2854
2855                         best_partition_bits = 0xffffffff;
2856                         for(rice_parameter = min_rice_parameter; rice_parameter <= max_rice_parameter; rice_parameter++) {
2857 #endif
2858 #ifdef VARIABLE_RICE_BITS
2859 #ifdef FLAC__SYMMETRIC_RICE
2860                                 partition_bits = (2+rice_parameter) * partition_samples;
2861 #else
2862                                 const unsigned rice_parameter_estimate = rice_parameter-1;
2863                                 partition_bits = (1+rice_parameter) * partition_samples;
2864 #endif
2865 #else
2866                                 partition_bits = 0;
2867 #endif
2868                                 partition_bits += FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN;
2869                                 save_residual_sample = residual_sample;
2870                                 for(partition_sample = 0; partition_sample < partition_samples; residual_sample++, partition_sample++) {
2871 #ifdef VARIABLE_RICE_BITS
2872 #ifdef FLAC__SYMMETRIC_RICE
2873                                         partition_bits += VARIABLE_RICE_BITS(abs_residual[residual_sample], rice_parameter);
2874 #else
2875                                         partition_bits += VARIABLE_RICE_BITS(abs_residual[residual_sample], rice_parameter_estimate);
2876 #endif
2877 #else
2878                                         partition_bits += FLAC__bitbuffer_rice_bits(residual[residual_sample], rice_parameter); /* NOTE: we will need to pass in residual[] in addition to abs_residual[] */
2879 #endif
2880                                 }
2881 #ifndef NO_RICE_SEARCH
2882                                 if(rice_parameter != max_rice_parameter)
2883                                         residual_sample = save_residual_sample;
2884                                 if(partition_bits < best_partition_bits) {
2885                                         best_rice_parameter = rice_parameter;
2886                                         best_partition_bits = partition_bits;
2887                                 }
2888                         }
2889 #endif
2890                         parameters[partition] = best_rice_parameter;
2891                         bits_ += best_partition_bits;
2892                 }
2893         }
2894
2895         *bits = bits_;
2896         return true;
2897 }
2898
2899 #ifdef DONT_ESTIMATE_RICE_BITS
2900 FLAC__bool set_partitioned_rice_with_precompute_(
2901         const FLAC__int32 residual[],
2902         const FLAC__uint64 abs_residual_partition_sums[],
2903         const unsigned raw_bits_per_partition[],
2904         const unsigned residual_samples,
2905         const unsigned predictor_order,
2906         const unsigned suggested_rice_parameter,
2907         const unsigned rice_parameter_search_dist,
2908         const unsigned partition_order,
2909         const FLAC__bool search_for_escapes,
2910         FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents,
2911         unsigned *bits
2912 )
2913 #else
2914 FLAC__bool set_partitioned_rice_with_precompute_(
2915         const FLAC__uint32 abs_residual[],
2916         const FLAC__uint64 abs_residual_partition_sums[],
2917         const unsigned raw_bits_per_partition[],
2918         const unsigned residual_samples,
2919         const unsigned predictor_order,
2920         const unsigned suggested_rice_parameter,
2921         const unsigned rice_parameter_search_dist,
2922         const unsigned partition_order,
2923         const FLAC__bool search_for_escapes,
2924         FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents,
2925         unsigned *bits
2926 )
2927 #endif
2928 {
2929         unsigned rice_parameter, partition_bits;
2930 #ifndef NO_RICE_SEARCH
2931         unsigned best_partition_bits;
2932         unsigned min_rice_parameter, max_rice_parameter, best_rice_parameter = 0;
2933 #endif
2934         unsigned flat_bits;
2935         unsigned bits_ = FLAC__ENTROPY_CODING_METHOD_TYPE_LEN + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN;
2936         unsigned *parameters, *raw_bits;
2937
2938         FLAC__ASSERT(suggested_rice_parameter < FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER);
2939
2940         FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(partitioned_rice_contents, max(6, partition_order));
2941         parameters = partitioned_rice_contents->parameters;
2942         raw_bits = partitioned_rice_contents->raw_bits;
2943
2944         if(partition_order == 0) {
2945                 unsigned i;
2946
2947 #ifndef NO_RICE_SEARCH
2948                 if(rice_parameter_search_dist) {
2949                         if(suggested_rice_parameter < rice_parameter_search_dist)
2950                                 min_rice_parameter = 0;
2951                         else
2952                                 min_rice_parameter = suggested_rice_parameter - rice_parameter_search_dist;
2953                         max_rice_parameter = suggested_rice_parameter + rice_parameter_search_dist;
2954                         if(max_rice_parameter >= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER) {
2955 #ifdef DEBUG_VERBOSE
2956                                 fprintf(stderr, "clipping rice_parameter (%u -> %u) @5\n", max_rice_parameter, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1);
2957 #endif
2958                                 max_rice_parameter = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1;
2959                         }
2960                 }
2961                 else
2962                         min_rice_parameter = max_rice_parameter = suggested_rice_parameter;
2963
2964                 best_partition_bits = 0xffffffff;
2965                 for(rice_parameter = min_rice_parameter; rice_parameter <= max_rice_parameter; rice_parameter++) {
2966 #endif
2967 #ifdef VARIABLE_RICE_BITS
2968 #ifdef FLAC__SYMMETRIC_RICE
2969                         partition_bits = (2+rice_parameter) * residual_samples;
2970 #else
2971                         const unsigned rice_parameter_estimate = rice_parameter-1;
2972                         partition_bits = (1+rice_parameter) * residual_samples;
2973 #endif
2974 #else
2975                         partition_bits = 0;
2976 #endif
2977                         partition_bits += FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN;
2978                         for(i = 0; i < residual_samples; i++) {
2979 #ifdef VARIABLE_RICE_BITS
2980 #ifdef FLAC__SYMMETRIC_RICE
2981                                 partition_bits += VARIABLE_RICE_BITS(abs_residual[i], rice_parameter);
2982 #else
2983                                 partition_bits += VARIABLE_RICE_BITS(abs_residual[i], rice_parameter_estimate);
2984 #endif
2985 #else
2986                                 partition_bits += FLAC__bitbuffer_rice_bits(residual[i], rice_parameter); /* NOTE: we will need to pass in residual[] instead of abs_residual[] */
2987 #endif
2988                         }
2989 #ifndef NO_RICE_SEARCH
2990                         if(partition_bits < best_partition_bits) {
2991                                 best_rice_parameter = rice_parameter;
2992                                 best_partition_bits = partition_bits;
2993                         }
2994                 }
2995 #endif
2996                 if(search_for_escapes) {
2997                         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;
2998                         if(flat_bits <= best_partition_bits) {
2999                                 raw_bits[0] = raw_bits_per_partition[0];
3000                                 best_rice_parameter = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER;
3001                                 best_partition_bits = flat_bits;
3002                         }
3003                 }
3004                 parameters[0] = best_rice_parameter;
3005                 bits_ += best_partition_bits;
3006         }
3007         else {
3008                 unsigned partition, residual_sample, save_residual_sample, partition_sample;
3009                 unsigned partition_samples;
3010                 FLAC__uint64 mean, k;
3011                 const unsigned partitions = 1u << partition_order;
3012                 for(partition = residual_sample = 0; partition < partitions; partition++) {
3013                         partition_samples = (residual_samples+predictor_order) >> partition_order;
3014                         if(partition == 0) {
3015                                 if(partition_samples <= predictor_order)
3016                                         return false;
3017                                 else
3018                                         partition_samples -= predictor_order;
3019                         }
3020                         mean = abs_residual_partition_sums[partition];
3021 #ifdef FLAC__SYMMETRIC_RICE
3022                         mean += partition_samples >> 1; /* for rounding effect */
3023                         mean /= partition_samples;
3024
3025                         /* calc rice_parameter = floor(log2(mean)) */
3026                         rice_parameter = 0;
3027                         mean>>=1;
3028                         while(mean) {
3029                                 rice_parameter++;
3030                                 mean >>= 1;
3031                         }
3032 #else
3033                         /* calc rice_parameter ala LOCO-I */
3034                         for(rice_parameter = 0, k = partition_samples; k < mean; rice_parameter++, k <<= 1)
3035                                 ;
3036 #endif
3037                         if(rice_parameter >= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER) {
3038 #ifdef DEBUG_VERBOSE
3039                                 fprintf(stderr, "clipping rice_parameter (%u -> %u) @6\n", rice_parameter, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1);
3040 #endif
3041                                 rice_parameter = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1;
3042                         }
3043
3044 #ifndef NO_RICE_SEARCH
3045                         if(rice_parameter_search_dist) {
3046                                 if(rice_parameter < rice_parameter_search_dist)
3047                                         min_rice_parameter = 0;
3048                                 else
3049                                         min_rice_parameter = rice_parameter - rice_parameter_search_dist;
3050                                 max_rice_parameter = rice_parameter + rice_parameter_search_dist;
3051                                 if(max_rice_parameter >= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER) {
3052 #ifdef DEBUG_VERBOSE
3053                                         fprintf(stderr, "clipping rice_parameter (%u -> %u) @7\n", max_rice_parameter, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1);
3054 #endif
3055                                         max_rice_parameter = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER - 1;
3056                                 }
3057                         }
3058                         else
3059                                 min_rice_parameter = max_rice_parameter = rice_parameter;
3060
3061                         best_partition_bits = 0xffffffff;
3062                         for(rice_parameter = min_rice_parameter; rice_parameter <= max_rice_parameter; rice_parameter++) {
3063 #endif
3064 #ifdef VARIABLE_RICE_BITS
3065 #ifdef FLAC__SYMMETRIC_RICE
3066                                 partition_bits = (2+rice_parameter) * partition_samples;
3067 #else
3068                                 const unsigned rice_parameter_estimate = rice_parameter-1;
3069                                 partition_bits = (1+rice_parameter) * partition_samples;
3070 #endif
3071 #else
3072                                 partition_bits = 0;
3073 #endif
3074                                 partition_bits += FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN;
3075                                 save_residual_sample = residual_sample;
3076                                 for(partition_sample = 0; partition_sample < partition_samples; residual_sample++, partition_sample++) {
3077 #ifdef VARIABLE_RICE_BITS
3078 #ifdef FLAC__SYMMETRIC_RICE
3079                                         partition_bits += VARIABLE_RICE_BITS(abs_residual[residual_sample], rice_parameter);
3080 #else
3081                                         partition_bits += VARIABLE_RICE_BITS(abs_residual[residual_sample], rice_parameter_estimate);
3082 #endif
3083 #else
3084                                         partition_bits += FLAC__bitbuffer_rice_bits(residual[residual_sample], rice_parameter); /* NOTE: we will need to pass in residual[] instead of abs_residual[] */
3085 #endif
3086                                 }
3087 #ifndef NO_RICE_SEARCH
3088                                 if(rice_parameter != max_rice_parameter)
3089                                         residual_sample = save_residual_sample;
3090                                 if(partition_bits < best_partition_bits) {
3091                                         best_rice_parameter = rice_parameter;
3092                                         best_partition_bits = partition_bits;
3093                                 }
3094                         }
3095 #endif
3096                         if(search_for_escapes) {
3097                                 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;
3098                                 if(flat_bits <= best_partition_bits) {
3099                                         raw_bits[partition] = raw_bits_per_partition[partition];
3100                                         best_rice_parameter = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER;
3101                                         best_partition_bits = flat_bits;
3102                                 }
3103                         }
3104                         parameters[partition] = best_rice_parameter;
3105                         bits_ += best_partition_bits;
3106                 }
3107         }
3108
3109         *bits = bits_;
3110         return true;
3111 }
3112
3113 unsigned get_wasted_bits_(FLAC__int32 signal[], unsigned samples)
3114 {
3115         unsigned i, shift;
3116         FLAC__int32 x = 0;
3117
3118         for(i = 0; i < samples && !(x&1); i++)
3119                 x |= signal[i];
3120
3121         if(x == 0) {
3122                 shift = 0;
3123         }
3124         else {
3125                 for(shift = 0; !(x&1); shift++)
3126                         x >>= 1;
3127         }
3128
3129         if(shift > 0) {
3130                 for(i = 0; i < samples; i++)
3131                          signal[i] >>= shift;
3132         }
3133
3134         return shift;
3135 }
3136
3137 void append_to_verify_fifo_(verify_input_fifo *fifo, const FLAC__int32 * const input[], unsigned input_offset, unsigned channels, unsigned wide_samples)
3138 {
3139         unsigned channel;
3140
3141         for(channel = 0; channel < channels; channel++)
3142                 memcpy(&fifo->data[channel][fifo->tail], &input[channel][input_offset], sizeof(FLAC__int32) * wide_samples);
3143
3144         fifo->tail += wide_samples;
3145
3146         FLAC__ASSERT(fifo->tail <= fifo->size);
3147 }
3148
3149 void append_to_verify_fifo_interleaved_(verify_input_fifo *fifo, const FLAC__int32 input[], unsigned input_offset, unsigned channels, unsigned wide_samples)
3150 {
3151         unsigned channel;
3152         unsigned sample, wide_sample;
3153         unsigned tail = fifo->tail;
3154
3155         sample = input_offset * channels;
3156         for(wide_sample = 0; wide_sample < wide_samples; wide_sample++) {
3157                 for(channel = 0; channel < channels; channel++)
3158                         fifo->data[channel][tail] = input[sample++];
3159                 tail++;
3160         }
3161         fifo->tail = tail;
3162
3163         FLAC__ASSERT(fifo->tail <= fifo->size);
3164 }
3165
3166 FLAC__StreamDecoderReadStatus verify_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data)
3167 {
3168         FLAC__StreamEncoder *encoder = (FLAC__StreamEncoder*)client_data;
3169         const unsigned encoded_bytes = encoder->private_->verify.output.bytes;
3170         (void)decoder;
3171
3172         if(encoder->private_->verify.needs_magic_hack) {
3173                 FLAC__ASSERT(*bytes >= FLAC__STREAM_SYNC_LENGTH);
3174                 *bytes = FLAC__STREAM_SYNC_LENGTH;
3175                 memcpy(buffer, FLAC__STREAM_SYNC_STRING, *bytes);
3176                 encoder->private_->verify.needs_magic_hack = false;
3177         }
3178         else {
3179                 if(encoded_bytes == 0) {
3180                         /*
3181                          * If we get here, a FIFO underflow has occurred,
3182                          * which means there is a bug somewhere.
3183                          */
3184                         FLAC__ASSERT(0);
3185                         return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
3186                 }
3187                 else if(encoded_bytes < *bytes)
3188                         *bytes = encoded_bytes;
3189                 memcpy(buffer, encoder->private_->verify.output.data, *bytes);
3190                 encoder->private_->verify.output.data += *bytes;
3191                 encoder->private_->verify.output.bytes -= *bytes;
3192         }
3193
3194         return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
3195 }
3196
3197 FLAC__StreamDecoderWriteStatus verify_write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
3198 {
3199         FLAC__StreamEncoder *encoder = (FLAC__StreamEncoder *)client_data;
3200         unsigned channel;
3201         const unsigned channels = FLAC__stream_decoder_get_channels(decoder);
3202         const unsigned blocksize = frame->header.blocksize;
3203         const unsigned bytes_per_block = sizeof(FLAC__int32) * blocksize;
3204
3205         for(channel = 0; channel < channels; channel++) {
3206                 if(0 != memcmp(buffer[channel], encoder->private_->verify.input_fifo.data[channel], bytes_per_block)) {
3207                         unsigned i, sample = 0;
3208                         FLAC__int32 expect = 0, got = 0;
3209
3210                         for(i = 0; i < blocksize; i++) {
3211                                 if(buffer[channel][i] != encoder->private_->verify.input_fifo.data[channel][i]) {
3212                                         sample = i;
3213                                         expect = (FLAC__int32)encoder->private_->verify.input_fifo.data[channel][i];
3214                                         got = (FLAC__int32)buffer[channel][i];
3215                                         break;
3216                                 }
3217                         }
3218                         FLAC__ASSERT(i < blocksize);
3219                         FLAC__ASSERT(frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER);
3220                         encoder->private_->verify.error_stats.absolute_sample = frame->header.number.sample_number + sample;
3221                         encoder->private_->verify.error_stats.frame_number = (unsigned)(frame->header.number.sample_number / blocksize);
3222                         encoder->private_->verify.error_stats.channel = channel;
3223                         encoder->private_->verify.error_stats.sample = sample;
3224                         encoder->private_->verify.error_stats.expected = expect;
3225                         encoder->private_->verify.error_stats.got = got;
3226                         encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA;
3227                         return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
3228                 }
3229         }
3230         /* dequeue the frame from the fifo */
3231         for(channel = 0; channel < channels; channel++) {
3232                 memmove(&encoder->private_->verify.input_fifo.data[channel][0], &encoder->private_->verify.input_fifo.data[channel][blocksize], encoder->private_->verify.input_fifo.tail - blocksize);
3233         }
3234         encoder->private_->verify.input_fifo.tail -= blocksize;
3235         return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
3236 }
3237
3238 void verify_metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
3239 {
3240         (void)decoder, (void)metadata, (void)client_data;
3241 }
3242
3243 void verify_error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
3244 {
3245         FLAC__StreamEncoder *encoder = (FLAC__StreamEncoder*)client_data;
3246         (void)decoder, (void)status;
3247         encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR;
3248 }