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