cngdec: Allow flushing the decoder

After a flush, don't average the output envelope and energy with
previous iterations.

Also start directly from the target values for the first iteration
at startup.

Signed-off-by: Martin Storsjö <martin@martin.st>
This commit is contained in:
Martin Storsjö 2012-10-30 12:03:25 +02:00
parent 036e6c37d3
commit 6b68223d31
1 changed files with 17 additions and 3 deletions

View File

@ -32,6 +32,7 @@ typedef struct CNGContext {
float *lpc_coef; float *lpc_coef;
int order; int order;
int energy, target_energy; int energy, target_energy;
int inited;
float *filter_out; float *filter_out;
float *excitation; float *excitation;
AVLFG lfg; AVLFG lfg;
@ -94,6 +95,12 @@ static void make_lpc_coefs(float *lpc, const float *refl, int order)
memcpy(lpc, cur, sizeof(*lpc) * order); memcpy(lpc, cur, sizeof(*lpc) * order);
} }
static void cng_decode_flush(AVCodecContext *avctx)
{
CNGContext *p = avctx->priv_data;
p->inited = 0;
}
static int cng_decode_frame(AVCodecContext *avctx, void *data, static int cng_decode_frame(AVCodecContext *avctx, void *data,
int *got_frame_ptr, AVPacket *avpkt) int *got_frame_ptr, AVPacket *avpkt)
{ {
@ -114,9 +121,15 @@ static int cng_decode_frame(AVCodecContext *avctx, void *data,
} }
} }
p->energy = p->energy / 2 + p->target_energy / 2; if (p->inited) {
for (i = 0; i < p->order; i++) p->energy = p->energy / 2 + p->target_energy / 2;
p->refl_coef[i] = 0.6 *p->refl_coef[i] + 0.4 * p->target_refl_coef[i]; for (i = 0; i < p->order; i++)
p->refl_coef[i] = 0.6 *p->refl_coef[i] + 0.4 * p->target_refl_coef[i];
} else {
p->energy = p->target_energy;
memcpy(p->refl_coef, p->target_refl_coef, p->order * sizeof(*p->refl_coef));
p->inited = 1;
}
make_lpc_coefs(p->lpc_coef, p->refl_coef, p->order); make_lpc_coefs(p->lpc_coef, p->refl_coef, p->order);
for (i = 0; i < p->order; i++) for (i = 0; i < p->order; i++)
@ -154,6 +167,7 @@ AVCodec ff_comfortnoise_decoder = {
.priv_data_size = sizeof(CNGContext), .priv_data_size = sizeof(CNGContext),
.init = cng_decode_init, .init = cng_decode_init,
.decode = cng_decode_frame, .decode = cng_decode_frame,
.flush = cng_decode_flush,
.close = cng_decode_close, .close = cng_decode_close,
.long_name = NULL_IF_CONFIG_SMALL("RFC 3389 comfort noise generator"), .long_name = NULL_IF_CONFIG_SMALL("RFC 3389 comfort noise generator"),
.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16, .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,