diff options
Diffstat (limited to 'libavcodec/cngdec.c')
-rw-r--r-- | libavcodec/cngdec.c | 43 |
1 files changed, 24 insertions, 19 deletions
diff --git a/libavcodec/cngdec.c b/libavcodec/cngdec.c index 482ef94..28432ac 100644 --- a/libavcodec/cngdec.c +++ b/libavcodec/cngdec.c @@ -2,26 +2,28 @@ * RFC 3389 comfort noise generator * Copyright (c) 2012 Martin Storsjo * - * This file is part of Libav. + * This file is part of FFmpeg. * - * Libav is free software; you can redistribute it and/or + * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * Libav is distributed in the hope that it will be useful, + * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with Libav; if not, write to the Free Software + * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include <math.h> #include "libavutil/common.h" +#include "libavutil/ffmath.h" +#include "libavutil/intreadwrite.h" #include "avcodec.h" #include "celp_filters.h" #include "internal.h" @@ -41,11 +43,11 @@ typedef struct CNGContext { static av_cold int cng_decode_close(AVCodecContext *avctx) { CNGContext *p = avctx->priv_data; - av_free(p->refl_coef); - av_free(p->target_refl_coef); - av_free(p->lpc_coef); - av_free(p->filter_out); - av_free(p->excitation); + av_freep(&p->refl_coef); + av_freep(&p->target_refl_coef); + av_freep(&p->lpc_coef); + av_freep(&p->filter_out); + av_freep(&p->excitation); return 0; } @@ -59,12 +61,12 @@ static av_cold int cng_decode_init(AVCodecContext *avctx) p->order = 12; avctx->frame_size = 640; - p->refl_coef = av_mallocz(p->order * sizeof(*p->refl_coef)); - p->target_refl_coef = av_mallocz(p->order * sizeof(*p->target_refl_coef)); - p->lpc_coef = av_mallocz(p->order * sizeof(*p->lpc_coef)); - p->filter_out = av_mallocz((avctx->frame_size + p->order) * + p->refl_coef = av_mallocz_array(p->order, sizeof(*p->refl_coef)); + p->target_refl_coef = av_mallocz_array(p->order, sizeof(*p->target_refl_coef)); + p->lpc_coef = av_mallocz_array(p->order, sizeof(*p->lpc_coef)); + p->filter_out = av_mallocz_array(avctx->frame_size + p->order, sizeof(*p->filter_out)); - p->excitation = av_mallocz(avctx->frame_size * sizeof(*p->excitation)); + p->excitation = av_mallocz_array(avctx->frame_size, sizeof(*p->excitation)); if (!p->refl_coef || !p->target_refl_coef || !p->lpc_coef || !p->filter_out || !p->excitation) { cng_decode_close(avctx); @@ -112,13 +114,18 @@ static int cng_decode_frame(AVCodecContext *avctx, void *data, if (avpkt->size) { int dbov = -avpkt->data[0]; - p->target_energy = 1081109975 * pow(10, dbov / 10.0) * 0.75; + p->target_energy = 1081109975 * ff_exp10(dbov / 10.0) * 0.75; memset(p->target_refl_coef, 0, p->order * sizeof(*p->target_refl_coef)); for (i = 0; i < FFMIN(avpkt->size - 1, p->order); i++) { p->target_refl_coef[i] = (avpkt->data[1 + i] - 127) / 128.0; } } + if (avctx->internal->skip_samples > 10 * avctx->frame_size) { + avctx->internal->skip_samples = 0; + return AVERROR_INVALIDDATA; + } + if (p->inited) { p->energy = p->energy / 2 + p->target_energy / 2; for (i = 0; i < p->order; i++) @@ -142,13 +149,11 @@ static int cng_decode_frame(AVCodecContext *avctx, void *data, p->excitation, avctx->frame_size, p->order); frame->nb_samples = avctx->frame_size; - if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) { - av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); + if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) return ret; - } buf_out = (int16_t *)frame->data[0]; for (i = 0; i < avctx->frame_size; i++) - buf_out[i] = p->filter_out[i + p->order]; + buf_out[i] = av_clip_int16(p->filter_out[i + p->order]); memcpy(p->filter_out, p->filter_out + avctx->frame_size, p->order * sizeof(*p->filter_out)); |