for (i = order-2; i >= 0; i--, k_ptr--, state_ptr--)
{
int k_value = *k_ptr, state_value = *state_ptr;
- x -= shift_down(k_value * (unsigned)state_value, LATTICE_SHIFT);
+ x -= (unsigned)shift_down(k_value * (unsigned)state_value, LATTICE_SHIFT);
state_ptr[1] = state_value + shift_down(k_value * (unsigned)x, LATTICE_SHIFT);
}
#else
for (i = order-2; i >= 0; i--)
{
- x -= shift_down(k[i] * state[i], LATTICE_SHIFT);
+ x -= (unsigned)shift_down(k[i] * state[i], LATTICE_SHIFT);
state[i+1] = state[i] + shift_down(k[i] * x, LATTICE_SHIFT);
}
#endif
// copes better with quantization, and calculates the
// actual whitened result as it goes.
-static int modified_levinson_durbin(int *window, int window_entries,
+static void modified_levinson_durbin(int *window, int window_entries,
int *out, int out_entries, int channels, int *tap_quant)
{
int i;
- int *state = av_calloc(window_entries, sizeof(*state));
+ int *state = window + window_entries;
- if (!state)
- return AVERROR(ENOMEM);
-
- memcpy(state, window, 4* window_entries);
+ memcpy(state, window, window_entries * sizeof(*state));
for (i = 0; i < out_entries; i++)
{
}
#endif
}
-
- av_free(state);
- return 0;
}
static inline int code_samplerate(int samplerate)
s->int_samples = av_calloc(s->frame_size, sizeof(*s->int_samples));
s->window_size = ((2*s->tail_size)+s->frame_size);
- s->window = av_calloc(s->window_size, sizeof(*s->window));
+ s->window = av_calloc(s->window_size, 2 * sizeof(*s->window));
if (!s->window || !s->int_samples)
return AVERROR(ENOMEM);
put_bits(&pb, 1, 0); // XXX FIXME: no custom tap quant table
flush_put_bits(&pb);
- avctx->extradata_size = put_bits_count(&pb)/8;
+ avctx->extradata_size = put_bytes_output(&pb);
av_log(avctx, AV_LOG_INFO, "Sonic: ver: %d.%d ls: %d dr: %d taps: %d block: %d frame: %d downsamp: %d\n",
s->version, s->minor_version, s->lossless, s->decorrelation, s->num_taps, s->block_align, s->frame_size, s->downsampling);
break;
}
- memset(s->window, 0, 4* s->window_size);
+ memset(s->window, 0, s->window_size * sizeof(*s->window));
for (i = 0; i < s->tail_size; i++)
s->window[x++] = s->tail[i];
s->tail[i] = s->int_samples[s->frame_size - s->tail_size + i];
// generate taps
- ret = modified_levinson_durbin(s->window, s->window_size,
+ modified_levinson_durbin(s->window, s->window_size,
s->predictor_k, s->num_taps, s->channels, s->tap_quant);
- if (ret < 0)
- return ret;
if ((ret = intlist_write(&c, state, s->predictor_k, s->num_taps, 0)) < 0)
return ret;
return ret;
}
-// av_log(avctx, AV_LOG_DEBUG, "used bytes: %d\n", (put_bits_count(&pb)+7)/8);
-
avpkt->size = ff_rac_terminate(&c, 0);
*got_packet_ptr = 1;
return 0;
.init = sonic_decode_init,
.close = sonic_decode_close,
.decode = sonic_decode_frame,
- .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_EXPERIMENTAL,
+ .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_EXPERIMENTAL | AV_CODEC_CAP_CHANNEL_CONF,
.caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
};
#endif /* CONFIG_SONIC_DECODER */