mirror of https://git.ffmpeg.org/ffmpeg.git
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:
parent
036e6c37d3
commit
6b68223d31
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue