/* first do max_partition_order */
for(partition_order = (int)max_partition_order; partition_order >= 0; partition_order--) {
- FLAC__int32 r, residual_partition_min, residual_partition_max;
+ FLAC__int32 r;
+ FLAC__uint32 rmax;
unsigned silog2_min, silog2_max;
unsigned partition, partition_sample, partition_samples, residual_sample;
const unsigned partitions = 1u << partition_order;
partition_samples = default_partition_samples;
if(partition == 0)
partition_samples -= predictor_order;
- residual_partition_min = residual_partition_max = 0;
+ rmax = 0;
for(partition_sample = 0; partition_sample < partition_samples; partition_sample++) {
- r = residual[residual_sample];
- if(r < residual_partition_min)
- residual_partition_min = r;
- else if(r > residual_partition_max)
- residual_partition_max = r;
- residual_sample++;
+ r = residual[residual_sample++];
+ if(r < 0)
+ rmax |= ~r;
+ else
+ rmax |= r;
}
- silog2_min = FLAC__bitmath_silog2(residual_partition_min);
- silog2_max = FLAC__bitmath_silog2(residual_partition_max);
- raw_bits_per_partition[partition] = max(silog2_min, silog2_max);
+ /* now we know all residual values are in the range [-rmax-1,rmax] */
+ raw_bits_per_partition[partition] = rmax? FLAC__bitmath_ilog2(rmax) + 2 : 1;
}
to_partition = partitions;
break; /*@@@ yuck, should remove the 'for' loop instead */
{
unsigned rice_parameter, partition_bits;
unsigned best_partition_bits, best_rice_parameter = 0;
- unsigned flat_bits;
unsigned bits_ = FLAC__ENTROPY_CODING_METHOD_TYPE_LEN + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN;
unsigned *parameters, *raw_bits;
#ifdef ENABLE_RICE_PARAMETER_SEARCH
}
#endif
if(search_for_escapes) {
- 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;
- if(flat_bits <= best_partition_bits) {
+ partition_bits = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN + raw_bits_per_partition[0] * residual_samples;
+ if(partition_bits <= best_partition_bits) {
raw_bits[0] = raw_bits_per_partition[0];
best_rice_parameter = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER;
- best_partition_bits = flat_bits;
+ best_partition_bits = partition_bits;
}
}
parameters[0] = best_rice_parameter;
}
#endif
if(search_for_escapes) {
- 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;
- if(flat_bits <= best_partition_bits) {
+ partition_bits = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN + raw_bits_per_partition[partition] * partition_samples;
+ if(partition_bits <= best_partition_bits) {
raw_bits[partition] = raw_bits_per_partition[partition];
best_rice_parameter = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER;
- best_partition_bits = flat_bits;
+ best_partition_bits = partition_bits;
}
}
parameters[partition] = best_rice_parameter;