|
|
|
@@ -53,6 +53,7 @@ static av_cold int ra144_encode_init(AVCodecContext * avctx) |
|
|
|
return -1; |
|
|
|
} |
|
|
|
avctx->frame_size = NBLOCKS * BLOCKSIZE; |
|
|
|
avctx->delay = avctx->frame_size; |
|
|
|
avctx->bit_rate = 8000; |
|
|
|
ractx = avctx->priv_data; |
|
|
|
ractx->lpc_coef[0] = ractx->lpc_tables[0]; |
|
|
|
@@ -433,7 +434,7 @@ static int ra144_encode_frame(AVCodecContext *avctx, uint8_t *frame, |
|
|
|
{ |
|
|
|
static const uint8_t sizes[LPC_ORDER] = {64, 32, 32, 16, 16, 8, 8, 8, 8, 4}; |
|
|
|
static const uint8_t bit_sizes[LPC_ORDER] = {6, 5, 5, 4, 4, 3, 3, 3, 3, 2}; |
|
|
|
RA144Context *ractx; |
|
|
|
RA144Context *ractx = avctx->priv_data; |
|
|
|
PutBitContext pb; |
|
|
|
int32_t lpc_data[NBLOCKS * BLOCKSIZE]; |
|
|
|
int32_t lpc_coefs[LPC_ORDER][MAX_LPC_ORDER]; |
|
|
|
@@ -445,11 +446,13 @@ static int ra144_encode_frame(AVCodecContext *avctx, uint8_t *frame, |
|
|
|
int energy = 0; |
|
|
|
int i, idx; |
|
|
|
|
|
|
|
if (ractx->last_frame) |
|
|
|
return 0; |
|
|
|
|
|
|
|
if (buf_size < FRAMESIZE) { |
|
|
|
av_log(avctx, AV_LOG_ERROR, "output buffer too small\n"); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
ractx = avctx->priv_data; |
|
|
|
|
|
|
|
/** |
|
|
|
* Since the LPC coefficients are calculated on a frame centered over the |
|
|
|
@@ -462,11 +465,15 @@ static int ra144_encode_frame(AVCodecContext *avctx, uint8_t *frame, |
|
|
|
lpc_data[i] = ractx->curr_block[BLOCKSIZE + BLOCKSIZE / 2 + i]; |
|
|
|
energy += (lpc_data[i] * lpc_data[i]) >> 4; |
|
|
|
} |
|
|
|
for (i = 2 * BLOCKSIZE + BLOCKSIZE / 2; i < NBLOCKS * BLOCKSIZE; i++) { |
|
|
|
lpc_data[i] = *((int16_t *)data + i - 2 * BLOCKSIZE - BLOCKSIZE / 2) >> |
|
|
|
2; |
|
|
|
energy += (lpc_data[i] * lpc_data[i]) >> 4; |
|
|
|
if (data) { |
|
|
|
int j; |
|
|
|
for (j = 0; j < avctx->frame_size && i < NBLOCKS * BLOCKSIZE; i++, j++) { |
|
|
|
lpc_data[i] = samples[j] >> 2; |
|
|
|
energy += (lpc_data[i] * lpc_data[i]) >> 4; |
|
|
|
} |
|
|
|
} |
|
|
|
if (i < NBLOCKS * BLOCKSIZE) |
|
|
|
memset(&lpc_data[i], 0, (NBLOCKS * BLOCKSIZE - i) * sizeof(*lpc_data)); |
|
|
|
energy = ff_energy_tab[quantize(ff_t_sqrt(energy >> 5) >> 10, ff_energy_tab, |
|
|
|
32)]; |
|
|
|
|
|
|
|
@@ -515,8 +522,17 @@ static int ra144_encode_frame(AVCodecContext *avctx, uint8_t *frame, |
|
|
|
ractx->old_energy = energy; |
|
|
|
ractx->lpc_refl_rms[1] = ractx->lpc_refl_rms[0]; |
|
|
|
FFSWAP(unsigned int *, ractx->lpc_coef[0], ractx->lpc_coef[1]); |
|
|
|
for (i = 0; i < NBLOCKS * BLOCKSIZE; i++) |
|
|
|
ractx->curr_block[i] = samples[i] >> 2; |
|
|
|
|
|
|
|
/* copy input samples to current block for processing in next call */ |
|
|
|
i = 0; |
|
|
|
if (data) { |
|
|
|
for (; i < avctx->frame_size; i++) |
|
|
|
ractx->curr_block[i] = samples[i] >> 2; |
|
|
|
} else |
|
|
|
ractx->last_frame = 1; |
|
|
|
memset(&ractx->curr_block[i], 0, |
|
|
|
(NBLOCKS * BLOCKSIZE - i) * sizeof(*ractx->curr_block)); |
|
|
|
|
|
|
|
return FRAMESIZE; |
|
|
|
} |
|
|
|
|
|
|
|
@@ -529,6 +545,7 @@ AVCodec ff_ra_144_encoder = { |
|
|
|
.init = ra144_encode_init, |
|
|
|
.encode = ra144_encode_frame, |
|
|
|
.close = ra144_encode_close, |
|
|
|
.capabilities = CODEC_CAP_DELAY | CODEC_CAP_SMALL_LAST_FRAME, |
|
|
|
.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16, |
|
|
|
AV_SAMPLE_FMT_NONE }, |
|
|
|
.long_name = NULL_IF_CONFIG_SMALL("RealAudio 1.0 (14.4K)"), |
|
|
|
|